Sql 如何使用动态查询的返回值更新当前表中的值?

Sql 如何使用动态查询的返回值更新当前表中的值?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在尝试将查询结果更新到现有表中,正如您所看到的,这是一个动态查询,我不知道如何在此代码中插入update函数。当我将其插入while函数时,它成功地发送了已执行的查询,但没有任何更新 我将此代码用于动态查询: Declare @SQL AS VARCHAR(MAX) DECLARE @TABLENAME AS VARCHAR(max); DECLARE @COLUMN1 A

我正在尝试将查询结果更新到现有表中,正如您所看到的,这是一个动态查询,我不知道如何在此代码中插入update函数。当我将其插入while函数时,它成功地发送了已执行的查询,但没有任何更新

我将此代码用于动态查询:

                    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
                   UPDATE MOMENTUM_Results

                   SET @COLUMN1 = @SQL

                   WHERE [MNEMONIC]='RANK_5';
问题是我不知道把它放在第1个代码中的什么地方。。或者如何正确使用它。。最后,这里是现有表的最终格式(我想要获得的最终结果,在其中我想要在第5行中插入查询结果)

有人有什么线索吗

打印结果:

             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".
执行结果:

             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".

update语句仅更新变量。 SET@xyz=@abc将设置@xyz变量

试试这个:

UPDATE MOMENTUM_Results
SET COLUMN1 = @SQL
WHERE [MNEMONIC]='RANK_5';
(注意:我在您的屏幕截图中没有看到“Column1”,因此我不知道您的MOMENTUM_结果表中是否存在该列。我可能也误解了您的问题……是否要使用动态查询的返回值更新MOMENTUM_结果表中的值?这是另一个答案

-编辑-

尝试将动态SQL更改为使用“更新…”而不是“选择”

差不多

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'''

update语句仅更新变量。 SET@xyz=@abc将设置@xyz变量

试试这个:

UPDATE MOMENTUM_Results
SET COLUMN1 = @SQL
WHERE [MNEMONIC]='RANK_5';
(注意:我在您的屏幕截图中没有看到“Column1”,因此我不知道您的MOMENTUM_结果表中是否存在该列。我可能也误解了您的问题……是否要使用动态查询的返回值更新MOMENTUM_结果表中的值?这是另一个答案

-编辑-

尝试将动态SQL更改为使用“更新…”而不是“选择”

差不多

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'''

< P> @ SQL只是一个字符串,而不是动态查询的选择结果,因此执行SET@ Caln1= @ SQL可能不是你想要的。当你执行动态SQL时,你应该把动态查询和代码的其余部分看作两个“并行宇宙”。,唯一连接它们的是它们可能正在编辑的公共表。我建议您在动态查询中声明一个变量,将AVG函数的结果分配给它,并在动态查询中执行更新。类似如下:

                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 '+@TABLENAME+' SET ' + @COLUMN1 + '= @avg
                        WHERE [MNEMONIC]=''RANK_5'''

               EXECUTE (@SQL)



                      SET @COUNTER = @COUNTER + 1;

                END
将@SQL声明为VARCHAR(MAX)
将@TABLENAME声明为VARCHAR(max);
将@COLUMN1声明为VARCHAR(max);
声明@COUNTER INT;
SET@TABLENAME='MOMENTUM_Results';
设置@COUNTER=2;

虽然@计数器< P> @ SQL只是一个字符串,而不是动态查询的选择结果,所以执行SET@ Caln1= @ SQL可能不是你想要的。当你执行动态SQL时,你应该把动态查询和代码的其余部分看作两个“并行宇宙”。,唯一连接它们的是它们可能正在编辑的公共表。我建议您在动态查询中声明一个变量,将AVG函数的结果分配给它,并在动态查询中执行更新。类似如下:

                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 '+@TABLENAME+' SET ' + @COLUMN1 + '= @avg
                        WHERE [MNEMONIC]=''RANK_5'''

               EXECUTE (@SQL)



                      SET @COUNTER = @COUNTER + 1;

                END
将@SQL声明为VARCHAR(MAX)
将@TABLENAME声明为VARCHAR(max);
将@COLUMN1声明为VARCHAR(max);
声明@COUNTER INT;
SET@TABLENAME='MOMENTUM_Results';
设置@COUNTER=2;

而@COUNTER您可能希望构建一种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..是动态设置的。

您可能希望构建一种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..是动态设置的。

如果是后者,感觉像是-尝试将动态SQL更改为使用“更新…”而不是“选择”感谢您的回答,但这正是您所说的,我正在尝试使用动态查询的返回值更新MOMENTUM_Results表中的值!如果是后者,感觉就像-尝试将动态SQL更改为使用“update…”而不是“SELECT”感谢您的回答,但这正是您所说的,我正在尝试使用动态查询的返回值更新MOMENTUM_Results表中的值!奇怪的是,我声明了变量@avg,并收到以下错误消息:“必须声明标量变量”@avg”@Robin_Hcp我很困惑,因为答案被接受了。你在动态查询中声明了变量吗?因为如果你在正常代码之外声明了变量,查询无法检测到它,因为查询是在不同的会话中执行的。我知道了!但是它没有更新表,表在行秩中一直显示空值。你可以调用PRINT@SQL就在EXEC之前,查看动态查询的构造是否正确,是否出现了错误。我用打印和执行的结果编辑了我的问题,以便您更好地了解发生了什么事情。我声明了变量@avg,并收到以下错误消息:“必须声明标量变量”@avg”@Robin_Hcp我很困惑,因为答案被接受了。你在动态查询中声明了变量吗?因为如果你在正常代码之外声明了变量,查询无法检测到它,因为查询是在不同的会话中执行的。我知道了!但是它没有更新表,表在行秩中一直显示空值。你可以调用PRINT@SQL就在EXEC之前,查看动态查询的构造是否正确,是否犯了错误。我用打印和执行的结果编辑了我的问题,以便您更好地了解发生了什么