Sql server 为什么SQL Server要求INT转换为NVARCHAR?

Sql server 为什么SQL Server要求INT转换为NVARCHAR?,sql-server,tsql,character-encoding,Sql Server,Tsql,Character Encoding,在昨天的一次考验中,我了解到您无法将此查询传递给EXEC(): 其中@SomeID是INT,@SQL是NVARCHAR。这将抱怨在执行期间无法将NVARCHAR转换回INT 我意识到你必须这样做 @SQL = @SQL + 'WHERE ID = ' + CONVERT(NVARCHAR(20), @SomeID) 我不明白的是为什么?为什么SQL Server在简单地将+:加载到NVARCHAR时不理解INT?我猜这和字符集有关 编辑:修复了打字错误(遗漏了一些+:s)。我不是说这肯定会起作

在昨天的一次考验中,我了解到您无法将此查询传递给EXEC():

其中@SomeID是INT,@SQL是NVARCHAR。这将抱怨在执行期间无法将NVARCHAR转换回INT

我意识到你必须这样做

@SQL = @SQL + 'WHERE ID = ' + CONVERT(NVARCHAR(20), @SomeID)
我不明白的是为什么?为什么SQL Server在简单地将+:加载到NVARCHAR时不理解INT?我猜这和字符集有关


编辑:修复了打字错误(遗漏了一些+:s)。

我不是说这肯定会起作用,我也不想在发布之前在我的sql management studio附近尝试它,但您是否尝试过类似的方法:

@SQL = @SQL + 'Where ID = ' + @SomeID
EXEC(@SQL)
+(字符串连接)

字符串表达式中的运算符 连接两个或多个的 字符或二进制字符串、列、, 或者字符串和列的组合 将名称转换为一个表达式(字符串 操作员)

表达式是任何有效的Microsoft®SQL Server™ 中任何数据类型的表达式 字符和二进制数据类型 类别,但图像、ntext或 文本数据类型。这两种表达方式都必须 属于相同的数据类型,或一个 表达式必须能够 隐式转换为数据类型 另一种表达方式。


所以。。。没有int到string的隐式转换。。。这是一个内部问题

Ach!那是个打字错误。我的错一个用来发现、纠正而不嘲笑我的人下一个问题当然是为什么不存在int到string的隐式转换,但我想我只能接受它。我想这是不允许的,因为它太容易出错(有可能会丢失数据(如果nvarchar字段太短了…),这与在C#中不能将int强制转换为bool的方式相同,但允许将int隐式转换为NVARCHAR,正如将NVARCHAR隐式转换为int一样。请参见:。上的图表。但是,当看到一个+运算符上有一个数字,另一个运算符上有一个char/nchar/varchar/NVARCHAR时,SQL Server会尝试隐式转换为数字类型,然后执行此操作输入一个add,而不是将数字转换为字符串和concatating。这是所需的歧义。MS(可能还有前面的Sybase)选择了一种方法。如果需要另一种方法,则必须使用显式转换。若要查看INT到NVARCHAR的隐式转换,请创建一个存储的进程,该进程接受NVARCHAR,然后使用INT进行调用。它可以工作,无需显式强制转换。
@SQL = @SQL + 'Where ID = ' + @SomeID
EXEC(@SQL)