首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >转换动态sql语句中的值时转换失败

转换动态sql语句中的值时转换失败
EN

Stack Overflow用户
提问于 2012-08-11 03:22:30
回答 3查看 949关注 0票数 1

我被以下sql服务器卡住了:

代码语言:javascript
运行
复制
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名称作为值之外的变量。有什么想法吗?

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-11 03:29:55

我将猜测ACTNUMST是一个字符串列,在这种情况下,您需要正确地对其进行分隔:

代码语言:javascript
运行
复制
SET @sql = 'SELECT ACTINDX FROM ' + quotename(@db) 
  + '.[dbo].[GL00105] WHERE ACTNUMST = ''' 
  + @value + ''';';

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

代码语言:javascript
运行
复制
SET @sql = 'SELECT ACTINDX FROM ' + quotename(@db) 
  + '.[dbo].[GL00105] WHERE ACTNUMST = ''' 
  + REPLACE(@value, '''', '''''') + ''';';

糟透了。一种更安全的方法是:

代码语言:javascript
运行
复制
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,并使您不必处理引号。

票数 3
EN

Stack Overflow用户

发布于 2012-08-11 03:30:54

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

代码语言:javascript
运行
复制
SET @sql = 'SELECT ACTINDX FROM ' + quotename(@db) + '.[dbo].[GL00105] WHERE ACTNUMST = ''' + @value + '''';
票数 0
EN

Stack Overflow用户

发布于 2012-08-11 03:38:00

当您尝试执行SQL时,这是否会失败?或者如果您注释了EXEC调用,它仍然会失败吗?

有一件事吸引了我的眼球,那就是你的@value前后没有任何单引号。因此,当构建@sql时,它最终会将其构建为...

代码语言:javascript
运行
复制
WHERE ACTNUMST = 1806-11-801-1000

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

代码语言:javascript
运行
复制
WHERE ACTNUMST = '1806-11-801-1000'

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

代码语言:javascript
运行
复制
SET @sql = 'SELECT ACTINDX FROM ' + quotename(@db) + '.[dbo].[GL00105] WHERE ACTNUMST = ''' + @value + '''';

这会将单引号添加到动态sql语句中。我希望这能帮到你。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11907978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档