2017-03-01 23 views
0

我想将我的查询结果更新到现有的表中,因为您可以看到它是一个动态查询,我不知道如何在此代码中插入更新函数。当我将其插入,而功能发送查询执行成功但没有任何更新..如何使用动态查询的返回值更新当前表中的值?

我用于动态查询验证码:

    Declare @SQL AS VARCHAR(MAX) 
        DECLARE @TABLENAME AS VARCHAR(max); 
        DECLARE @COLUMN1 AS VARCHAR(max); 
        DECLARE @COUNTER INT; 
        SET @TABLENAME = 'MOMENTUM_Results'; 
        SET @COUNTER = 2; 

        WHILE @COUNTER<=122 
        BEGIN 

         SELECT @COLUMN1 = C.Name 
         FROM sys.Columns C 
         WHERE OBJECT_NAME(C.object_id) = @TABLENAME 
         AND C.column_id = @COUNTER 
          ; 



          SET @SQL = 'SELECT AVG(MR.[' + @COLUMN1 + ']) From MOMENTUM_Quintile MQ 
          Left Join MOMENTUM_Returns MR on MQ.Mnemonic = MR.Mnemonic WHERE MQ.[' + @COLUMN1 + '] = 5' 



          EXECUTE (@SQL) 



           SET @COUNTER = @COUNTER + 1; 

         END 

要获得这些结果:

enter image description here

,现在我想通过使用此代码更新当前表:

    UPDATE MOMENTUM_Results 

        SET @COLUMN1 = @SQL 

        WHERE [MNEMONIC]='RANK_5'; 

的问题是,我不知道在哪里把它放在第一代码..或如何正确地使用它..并且终于在这里是现有的表(最终结果的最终格式我想获得,我在其中要插入的行RANK_5查询结果)

enter image description here

人如果有任何线索?

打印结果:

   DECLARE @avg as float; 

      SELECT @avg = AVG(MR.[2006-12-30]) From MOMENTUM_Quintile MQ 

      Left Join MOMENTUM_Returns MR on MQ.Mnemonic = MR.Mnemonic WHERE MQ.[2006-12-30] = 5; 

      UPDATE MOMENTUM_Results_new SET @COLUMN1 = @avg 
      WHERE [MNEMONIC]=RANK_5 

执行结果:

   Msg 137, Level 15, State 1, Line 6 
       Must declare the scalar variable "@COLUMN1". 
       Msg 137, Level 15, State 1, Line 6 
       Must declare the scalar variable "@COLUMN1". 
       Msg 137, Level 15, State 1, Line 6 
       Must declare the scalar variable "@COLUMN1". 
       Msg 137, Level 15, State 1, Line 6 
       Must declare the scalar variable "@COLUMN1". 
       Msg 137, Level 15, State 1, Line 6 
       Must declare the scalar variable "@COLUMN1". 

回答

1

@SQL只是一个字符串,而不是动态查询的SELECT结果,所以执行SET @ COLUMN1 = @SQL是不是可能是你想要的。另外,当你执行动态sql时,你应该将动态查询和其他代码视为两个“并行Universe”,连接它们的唯一方法就是可能正在编辑的公用表。我建议你在动态查询中声明一个变量,为其分配AVG函数的结果并在动态中执行UPDATE。事情是这样的:

   Declare @SQL AS VARCHAR(MAX) 
       DECLARE @TABLENAME AS VARCHAR(max); 
       DECLARE @COLUMN1 AS VARCHAR(max); 
       DECLARE @COUNTER INT; 
       SET @TABLENAME = 'MOMENTUM_Results'; 
       SET @COUNTER = 2; 

       WHILE @COUNTER<=122 
       BEGIN 

        SELECT @COLUMN1 = C.Name 
        FROM sys.Columns C 
        WHERE OBJECT_NAME(C.object_id) = @TABLENAME 
        AND C.column_id = @COUNTER 
         ; 

       SET @SQL = 'DECLARE @avg float; 
         SELECT @avg = AVG(MR.[' + @COLUMN1 + ']) From MOMENTUM_Quintile MQ 
         Left Join MOMENTUM_Returns MR on MQ.Mnemonic = MR.Mnemonic WHERE MQ.[' + @COLUMN1 + '] = 5; 
         UPDATE '[email protected]+' SET ' + @COLUMN1 + '= @avg 
         WHERE [MNEMONIC]=''RANK_5''' 

       EXECUTE (@SQL) 



         SET @COUNTER = @COUNTER + 1; 

       END 

我可能有语法错误,我没有测试它,但你明白我的意思

+0

这很奇怪bc我声明了变量@avg,我得到这个错误信息:“必须声明标量变量”@avg“” –

+0

@Robin_Hcp我很困惑,因为答案被接受了。你是否在动态查询中声明了变量?因为如果你以普通代码的形式在外面执行它,查询无法检测到它,因为查询在不同的会话中执行 – jambonick

+0

我明白了!但它并没有更新表格,表格一直在行中显示NULL值RANK_5 –

1

你的更新语句只更新一个变量。 SET @xyz = @abc将设置@xyz变量。

试试这个:

UPDATE MOMENTUM_Results 
SET COLUMN1 = @SQL 
WHERE [MNEMONIC]='RANK_5'; 

(注:我没有看到一个“列1”在你的屏幕截图,所以我不知道,如果你MOMENTUM_Results表中存在专栏中,我也可能会误解你的问题......你想从动态查询返回值,以更新MOMENTUM_Results表中的值?这是一个不同的答案。

CNC中

试着改变你的动态SQL使用“U​​PDATE .. 。“而不是”SELECT“

喜欢的东西

SET @SQL = 'UPDATE MOMENTUM_Results SET ' + @COLUMN1 + ' = AVG(MR.[' + @COLUMN1 + ']) From MOMENTUM_Quintile MQ 
          Left Join MOMENTUM_Returns MR on MQ.Mnemonic = MR.Mnemonic WHERE MQ.[' + @COLUMN1 + '] = 5 AND MOMENTUM_Results.MNEMONIC=''RANK_5''' 
+0

如果是后者,它的感觉就像尝试更改动态SQL以使用“UPDATE ...”而不是“SELECT” – Paurian

+0

感谢您的回答,但这正是您所说的,我试图更新数值带有来自动态查询的返回值的MOMENTUM_Results表! –

1

您可能希望建立一个单独的SQL类型的

UPDATE mrs SET 
col1 = x.co1, col2 = x.col2, .. 
FROM MOMENTUM_Results mrs 
CROSS JOIN 
(SELECT AVG(case mq.col1 when 5 then mr.col1 end) col1, .. 
FROM MOMENTUM_Quintile mq 
LEFT JOIN MOMENTUM_Returns mr ON MQ.Mnemonic = mr.Mnemonic 
        AND (5 IN mq.col1, ..) 
) x 
WHERE mrs.[MNEMONIC]='RANK_5'; 

哪里动态设置col1,col2 ..

相关问题