2009-08-25 135 views
1

在磨难昨天,我才知道,你无法通过这个查询EXEC():为什么SQL Server要求将INT转换为NVARCHAR?

@SQL = @SQL + 'WHERE ID = ' + @SomeID 
EXCEC(@SQL) 

凡@SomeID是INT和@SQL是NVARCHAR。这会抱怨在执行期间无法将NVARCHAR转换回INT。

我意识到你必须要做得像

@SQL = @SQL + 'WHERE ID = ' + CONVERT(NVARCHAR(20), @SomeID) 

什么我不明白是为什么呢?为什么SQL Server仅仅在+对NVARCHAR进行操作时才理解INT?我猜它与char集有关。

编辑:修正了错别字(错过了一些+:s)。

回答

2

+(字符串串联)

在字符串表达式 连接两个或更多个 字符或二进制串,列, 或字符串和列的组合操作者名称合并为一个表达式(字符串 运算符)。

表达是 的任何数据类型的任何有效的微软SQL服务器™ 表达除图像,ntext或 文本数据类型的字符和二进制 数据类型类别。两个表达式必须为 必须是相同的数据类型,或一个 表达式必须能够将 隐式转换为其他表达式的数据类型 。

所以......有数据类型为int的字符串没有隐含皈依......这是一个内部问题

+0

接下来的问题当然是为什么int没有隐式转换为字符串,但我想我只需要忍受它。 – 2009-08-25 06:49:35

+1

我想这是不允许的,因为它太容易出错(有可能会丢失数据(如果nvarchar字段太短...),同样的方式,你不能将int转换为bool在C# – 2009-08-25 06:59:03

+1

但是可以将INT隐式转换为NVARCHAR,因为可以将NVARCHAR隐式转换为INT。请参阅http://msdn.microsoft.com/en-us/library/aa226054(SQL.80).aspx上的图表。 ,当看到一个数字为+的运算符,另一端使用char/nchar/varchar/nvarchar时,SQL Server将尝试隐式转换为数字类型,然后执行一个添加,而不是将数字转换为字符串并进行协调。如果你想要另一个,你必须使用显式转换。 – 2009-08-25 17:09:48

1

我不是说这肯定会工作,我不靠近我的SQL管理工作室发布前尝试一下,但你有没有尝试过这样的事情:

@SQL = @SQL + 'Where ID = ' + @SomeID 
EXEC(@SQL) 
+0

胆碱!这是一个错字。我的错。 +一个发现,纠正而不嘲笑我。 ;) – 2009-08-25 06:44:06