Sql server 在SQL nvarchar中选择top而不是int

Sql server 在SQL nvarchar中选择top而不是int,sql-server,Sql Server,我尝试使用参数中具有最大值的select语句,如: CREATE PROCEDURE PROC_TOP @NUM INT AS DECLARE @SQL VARCHAR(255) = 'SELECT TOP ' + @NUM + ' * FROM MYTABLE;' BEGIN EXEC sp_executesql @SQL END 它返回一个错误: 将varchar值“SELECT TOP”转换为时失败 数据类型int 但是,当我从int更改为nvarchar时,它的工作: PROC

我尝试使用参数中具有最大值的select语句,如:

CREATE PROCEDURE PROC_TOP @NUM INT AS
DECLARE @SQL VARCHAR(255) = 'SELECT TOP ' + @NUM + ' * FROM MYTABLE;'
BEGIN
    EXEC sp_executesql @SQL
END
它返回一个错误:

将varchar值“SELECT TOP”转换为时失败 数据类型int

但是,当我从
int
更改为
nvarchar
时,它的工作:

PROC_TOP @NUM nvarchar(50)
DECLARE @SQL nvarchar(255)
我的问题是:


为什么Sql接受数据类型
nvarchar
而不是
Int

字符串与+连接不会进行数据类型转换,如果使用concat,它将隐式进行数据类型转换,如下所示

DECLARE @SQL VARCHAR(255) = 'SELECT TOP ' + cast(@NUM as varchar(6)) + ' * FROM MYTABLE;'
CREATE PROCEDURE PROC_TOP @NUM INT AS
DECLARE @SQL VARCHAR(255) = concat('SELECT TOP ' , @NUM , ' * FROM MYTABLE;')
BEGIN
    EXEC sp_executesql @SQL
END

如果declaresqlvarchar(255)更改为declaresqlvarchar(255),则这是可行的。。谢谢——为什么?哪个版本的sql server?我使用的是2008。。我对你的帖子投了赞成票,但我认为有人对它投了反对票。