运行此代码时:
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
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
将 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为 to 以避免字符串被隐式转换为整数(由于字符串不是数字而失败)
SET @SQL = N'
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 )
= ' + CAST(@intFlag AS NVARCHAR(11)) + N')';
Run Code Online (Sandbox Code Playgroud)
或者根本不连接它,sp_executesql而是将它作为参数传入。
SET @SQL = N'
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, N'@intFlag INT', @intFlag = @intFlag
Run Code Online (Sandbox Code Playgroud)