【问题标题】:Parameterizing Dynamic SQL issue with SQL_VARIANT datatype使用 SQL_VARIANT 数据类型参数化动态 SQL 问题
【发布时间】:2009-11-13 23:09:39
【问题描述】:

我一直在重构一个巨大的动态 SQL 语句,并且认为我可能遇到了障碍。目标是对其进行参数化。我使用的是 SQL Server 2005。

我有一个 int 变量 (@i),它决定了我需要更新的列。这是我一直在做的事情:

if @i = 1
 begin
  set @updateClause = 'Column1 = @newValue';
  set @updateClauseDataType = 'varchar(10)';
  set @updateValue = @foo;      
 end
else if @i = 2
 begin
  set @updateClause = 'Column2 = @newValue';
  set @updateClauseDataType = 'int';
  set @updateValue = @bar;      
 end
else if ...

然后,我尝试执行我的语句:

set @statement = N'update ' + @server_name + '.' + @database_name + '.dbo.Table1 
  set ' + @updateClause + ' where pk = @pk';

set @parameters = '@newValue ' + @updateClauseDataType + ',      
 @pk uniqueidentifier';


execute sp_executesql @statement, 
 @parameters,
 @newValue = @newValue,
 @pk= @pk;

这会导致:

从数据类型隐式转换 不允许将 sql_variant 转换为 varchar。 使用 CONVERT 函数来运行它 查询。

如果我能以某种方式将@updateValue 转换为正确的类型,我可以解决这个问题,我已将其作为文本存储在@updateClauseDataType 中。有没有什么办法可以做到这一点,而无需使用巨大的 if 语句来询问 @updateClauseDataType 的值?

【问题讨论】:

    标签: sql sql-server tsql dynamic-sql


    【解决方案1】:

    重读时,既然你已经知道数据类型,为什么不将它包含在更新子句中呢?

    set @updateClause = 'Column1 = cast(@newValue as varchar(10))';
    set @updateClauseDataType = 'varchar(10)';
    

    或者避免两次键入数据类型:

    set @updateClauseDataType = 'varchar(10)';
    set @updateClause = 'Column1 = cast(@newValue as ' +
        @updateClauseDataType + ')';
    

    【讨论】:

    • 我不认为这是发生这种情况的地方——它在“SET”之一中,仔细阅读。此外,如果 myfield 被索引,这将提高性能,因为索引不能被有效地使用......
    猜你喜欢
    • 2019-07-11
    • 2012-02-20
    • 1970-01-01
    • 2010-09-28
    • 2011-06-01
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多