转换失败
我坚持以下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 na我作为一个变量,除了价值。有什么想法吗?
感谢
我要去猜测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, '''', '''''') + ''';';
Yuck。一个更安全的方法是:
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更好一点,也可以防止你不得不处理报价。
这可能会发生,因为您没有引用char值。试试这个
SET @sql = 'SELECT ACTINDX FROM ' + quotename(@db) + '.[dbo].[GL00105] WHERE ACTNUMST = ''' + @value + '''';
谢谢!我以为是这样的,但是我一定有错误的语法,因为我没有到任何地方。 – apd23 2012-08-10 19:34:11
当您尝试执行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-10 20:40:15
完美!我想它只是需要额外的引号并结束? – apd23 2012-08-10 19:33:00
@ apd23是的,如果它是一个字符串,它需要被''分隔''。 – 2012-08-10 19:33:20