4

我有这个查询:

DECLARE @selectsql nvarchar(4000),
DECLARE @cnt int

select @selectsql = ' SELECT ' + @cnt + '= COUNT(*) FROM Vwbckup' 

print @selectsql
print @cnt

EXEC sp_executesql @selectsql

当我执行查询时,我收到此错误:

将 varchar 值“SELECT”转换为数据类型 int 时转换失败。

4

3 回答 3

8

您的 @cnt 变量是 INT 类型 - 您需要将其转换为 NVARCHAR 以连接在一起:

DECLARE @selectsql nvarchar(4000),
DECLARE @cnt int

SELECT @selectsql = N' SELECT ' + CAST(@cnt AS NVARCHAR(10)) + N'= COUNT(*) FROM Vwbckup' 

另外:您应该在字符串文字前加上N表示 Unicode ( NVARCHAR) 字符串

更新:之前的命令真的没有任何意义....你的意思是创建这个命令字符串吗?

SELECT @selectsql = N' SELECT @cnt = COUNT(*) FROM Vwbckup' 

然后执行它?

于 2012-11-28T14:16:22.093 回答
1

您显然不需要动态 SQL,但如果您出于某种原因未显示您根本不需要连接该部分。您可以使用OUTPUT参数。

DECLARE @selectsql NVARCHAR(4000),
        @cnt       INT

SELECT @selectsql = N'SELECT @cnt = COUNT(*) FROM Vwbckup'

PRINT @selectsql

PRINT @cnt

EXEC sp_executesql
  @selectsql,
  N'@cnt int output',
  @cnt OUTPUT

SELECT @cnt 
于 2012-11-28T14:20:52.413 回答
0

将 an 连接int成字符串 =>强制转换

问题不在于 SQL 何时执行,而是在它生成之前,因为您正在连接字符串和整数变量。

你应该转换你的整数变量:

select @selectsql = 'SELECT ' + cast(@cnt as nvarchar) + ' = COUNT(*) FROM Vwbckup'

但是您确实意识到变量的值将被连接到您的结果字符串中。我不确定你想要那个...

于 2012-11-28T14:16:33.010 回答