我被以下sql服务器卡住了:
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名称作为值之外的变量。有什么想法吗?
谢谢
发布于 2012-08-11 03:29:55
我将猜测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-11 03:30:54
这可能是因为您没有引用char值。尝尝这个
SET @sql = 'SELECT ACTINDX FROM ' + quotename(@db) + '.[dbo].[GL00105] WHERE ACTNUMST = ''' + @value + '''';
发布于 2012-08-11 03:38:00
当您尝试执行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语句中。我希望这能帮到你。
https://stackoverflow.com/questions/11907978
复制相似问题