转换失败 varchar 到 int

Mar*_*rin -1 sql-server-2008

运行此代码时:

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 它也不起作用。我缺少什么吗?谢谢。

Mar*_*ith 8

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)