1

我被困在以下 sql server 上:

DECLARE @sql AS NVARCHAR(500),@db as varchar(50),@value AS CHAR(129);
SET @db = 'SSCT1';
SET @value = '1806-11-801-1000';
SET @sql = 'SELECT ACTINDX FROM ' + quotename(@db) 
  + '.[dbo].[GL00105] WHERE ACTNUMST = ' + @value;
EXEC (@sql);

当我在 sql server 中运行它时,我得到:转换 varchar 值 '1806-11-801-1000 时转换失败

我检查了我使用 where 子句的字段,它与声明中的类型 (char(129) 相匹配,所以我不确定它试图转换什么。

我正在尝试构建一个 sql 语句,除了值之外,它还将接受 db 名称作为变量。有什么想法吗?

谢谢

4

3 回答 3

3

我猜这ACTNUMST是一个字符串列,在这种情况下,您需要正确分隔它:

SET @sql = 'SELECT ACTINDX FROM ' + quotename(@db) 
  + '.[dbo].[GL00105] WHERE ACTNUMST = ''' 
  + @value + ''';';

如果@value可能包含撇号,则需要进一步处理:

SET @sql = 'SELECT ACTINDX FROM ' + quotename(@db) 
  + '.[dbo].[GL00105] WHERE ACTNUMST = ''' 
  + REPLACE(@value, '''', '''''') + ''';';

呸。更安全的方法是:

DECLARE 
  @sql   NVARCHAR(MAX),
  @db    SYSNAME,
  @value CHAR(129);

SELECT
  @db = N'SSCT1',
  @value = '1806-11-801-1000';

SET @sql = N'SELECT ACTINDX FROM ' + quotename(@db) 
  + '.[dbo].[GL00105] WHERE ACTNUMST = @val;';

EXEC sp_executesql @sql, N'@val CHAR(129)', @value;

这可以更好地防止动态 SQL,并且还可以防止您不得不处理引号。

于 2012-08-10T19:29:55.293 回答
0

这可能是因为您没有引用 char 值。试试这个

SET @sql = 'SELECT ACTINDX FROM ' + quotename(@db) + '.[dbo].[GL00105] WHERE ACTNUMST = ''' + @value + '''';
于 2012-08-10T19:30:53.720 回答
0

当您尝试执行 SQL 时,这会失败吗?或者,如果您评论 EXEC 调用,它仍然会失败吗?

引起我注意的一件事是,您的@value 周围没有任何单引号。所以当@sql被构建时,它最终会被构建为......

WHERE ACTNUMST = 1806-11-801-1000

但是,它应该看起来像这样......

WHERE ACTNUMST = '1806-11-801-1000'

如果这确实是您的问题,那么您应该将您的 SET @sql 修改为以下...

SET @sql = 'SELECT ACTINDX FROM ' + quotename(@db) + '.[dbo].[GL00105] WHERE ACTNUMST = ''' + @value + '''';

这会将单引号添加到您的动态 sql 语句中。我希望这有帮助。

于 2012-08-10T19:38:00.120 回答