运行此代码时:
declare @SQL NVARCHAR(max);
declare @intFlag INT;
set @intFlag = 2;
SET @SQL = ' SELECT * into [##tmp1]
FROM servicesstats_0511_0412 s WHERE department=''ACC''
and ((SELECT COUNT(*) FROM servicesstats_0511_0412 WHERE department <> ''ACC''
and s.studentid=studentid ) = ' + @intFlag + ')';
EXEC SP_EXECUTESQL @SQL
我收到以下错误:
将 varchar 值 ' SELECT * 转换为 [##tmp1] FROM servicesstats_0511_0412 s WHERE department='ACC' and ((SELECT COUNT(*) FROM servicesstats_0511_0412 WHERE department <> 'ACC' and s.studentid=studentid ) 时转换失败' 到数据类型 int。
servicesstats_0511_0412 将是动态的,因此需要动态 SQL。
我认为这不应该发生,因为 count(*) 总是返回一个 Int。即使将子查询转换为 Int 也不起作用。有什么我想念的吗?谢谢。
int
具有更高的数据类型优先级,[n]varchar
因此您需要在字符串连接中int
显式转换为[n]varchar
,以避免字符串被隐式转换为整数(由于字符串不是数字而失败)或者根本不连接它并将其作为参数传递给
sp_executesql
。虽然 Martin 已经完全回答了您的问题,但我完全不明白您为什么需要在这里使用动态 SQL。
也许你只见树木不见森林?
问题不在这里 count(*)
或者