【问题标题】:SQL Update - variablesSQL 更新 - 变量
【发布时间】:2020-06-23 17:18:49
【问题描述】:

我遇到了一个关于更新表的 SQL 问题(在任何地方都找不到答案)。

问题如下:

Update TABLE1
    SET @variable1 = @variable2
    WHERE SomeColumn = @variable3;

其中 variable1 和 variable3 是 varchar(50) 的类型,而 variable2 是 int 的类型。我怎样才能使它工作?我一直在尝试使用 EXEC 或许多其他简单的选项,但它们似乎不适合我。

在我在这里给出的代码示例中,变量 2 的值被分配给变量 1,而不是名称等于变量 1 的列,当我尝试使用 Exec 时,它无法正确读取变量 2(因为 int 类型) .

【问题讨论】:

  • 查询没有意义。它在做什么?
  • 我应该编写一个使 Table 看起来不同的过程(与我使用 PIVOT 相同,但我无法使用该操作),这就是为什么最后我需要更新 Table有3个变量。这篇文章下的答案是有效的......但我的程序中似乎还有另一个问题......“Msg 207, Level 16, State 1, Line 85 Invalid column name 'Doors'。”不知道为什么 SQL 没有将其视为 row 的值,在名为 SomeColumn 的列中,它正在寻找名为“Doors”的列... Ps.我在 SomeColumn 列下确实有记录 Doors :/跨度>

标签: sql sql-server variables sql-update


【解决方案1】:
DECLARE @variable1 varchar(50)
DECLARE @variable2 varchar(50)
DECLARE @variable3 varchar(50)
DECLARE @Sql varchar(max)

SET @variable1 = col1

Set @sql = 'Update TABLE1 SET' + @variable1 +' ='+ @variable2 +
    'WHERE SomeColumn = '+ @variable3

EXEC (@Sql)

如果需要动态设置@variable1

【讨论】:

    【解决方案2】:

    你需要使用动态SQL:

    declare @sql nvarchar(max);
    
    set @sql = '
    Update TABLE1
        SET @variable1 = @variable2
        WHERE SomeColumn = @variable3';
    
    set @sql = replace(@sql, '@variable1', @variable1);
    
    exec sp_executesql @sql,
                       N'@variable2 int, @variable3 varchar(50)',
                       @variable2 = @variable2, @variable3 = @variable3;
    

    注意:使用replace() 是因为标识符(表名、列名、函数调用等)不能由参数表示。

    【讨论】:

      【解决方案3】:

      这个查询并没有像你想象的那样做!当您在参数@Variable1 中提供值“Doors”时,您会收到“Doors”错误。 @Variable1 必须是 TABLE1 中的有效列名。 SomeColumn 与它无关。

      每当要在运行时决定架构元素(列名、表名)时,您需要使用字符串方法动态构建 sql,正如其他答案所说。我想说,这总是一个坏主意。你永远必须这样做。您的变量没有有意义的名称,这有点增加了混乱。您可能已经这样做了,因为在设计时,除了变量是变量之外,您对变量一无所知。这对我来说是一个明显的迹象,表明你试图用一个查询做太多事情。没有人会在您之后维护此代码。当你写它的时候,你可能会忘记你到底想做什么。 (我仍然不清楚,如果你坚持下去,你是否能到达你想去的地方)。

      【讨论】:

      • 嗯,这个命名模式只是为堆栈的溢出问题而设计的。在我的真实查询中,我有正常的列名称,我只是不想在这里用不同的语言放一些奇怪的词,因为它应该是一个尽可能简单易懂的例子;d 顺便说一句,我发现回答我的问题。每次我输入变量时,我都必须在 EXEC 中输入这样的内容:“...'''+@variable+'''...”它对我有用;)感谢您的帮助和时间跨度>
      【解决方案4】:
      IF OBJECT_ID('tempdb..#TAB') IS NOT NULL
      BEGIN
          DROP TABLE #TAB
      END
      
      CREATE TABLE #TAB
      (CH1 INT,CH2 INT,CH3 INT)
      
      DECLARE @CH2 INT = NULL , @CH3 INT=NULL,@SPID INT=NULL,@SQL NVARCHAR(4000)='', @ParmDefinition NVARCHAR(50)= ''
      
      SET @ParmDefinition='@SPID INT,@CH2 INT OUTPUT,@CH3 INT OUTPUT'
      
      SET @SQL='UPDATE TOP(1) #TAB SET CH1=@SPID,@CH2= CH2,@CH3= CH3 WHERE CH1 IS NULL'
      
      INSERT INTO #TAB
      (CH2 ,CH3 )
      SELECT 1,2 UNION ALL
      SELECT 2,3 UNION ALL
      SELECT 3,4
      
      WHILE EXISTS(SELECT TOP 1 1 FROM #TAB WHERE CH1 IS NULL)
      BEGIN
          EXECUTE sp_executesql @SQL, @ParmDefinition,@SPID =@@SPID,  @CH2=@CH2 OUTPUT,@CH3=@CH3 OUTPUT;  
      
          SELECT * FROM #TAB
          SELECT @CH2,@CH3
      
      END
      

      【讨论】:

        猜你喜欢
        • 2012-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多