2012-08-10 149 views
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 na我作为一个变量,除了价值。有什么想法吗?

感谢

回答

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, '''', '''''') + ''';'; 

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更好一点,也可以防止你不得不处理报价。

+0

完美!我想它只是需要额外的引号并结束? – apd23 2012-08-10 19:33:00

+0

@ apd23是的,如果它是一个字符串,它需要被''分隔''。 – 2012-08-10 19:33:20

0

这可能会发生,因为您没有引用char值。试试这个

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

谢谢!我以为是这样的,但是我一定有错误的语法,因为我没有到任何地方。 – apd23 2012-08-10 19:34:11

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语句中。我希望这有帮助。

+0

格式化代码示例时,请使用'{}'按钮。 – 2012-08-10 20:40:15