【问题标题】:Assign dynamic SQL Query result to a variable and then use variable to in UPDATE TABLE将动态 SQL 查询结果分配给变量,然后在 UPDATE TABLE 中使用变量
【发布时间】:2022-08-20 04:02:30
【问题描述】:

应用:MS SSMS 版本:18.12.1 视窗 10

我有表名 1包含以下信息

col1Name col2Name col3Name
-,99 fred 1,23

col1 - col2 - col3 都是字符串数据类型

col1 序数值 = 1
col2 序数值 = 2
col3 序数值 = 3

我使用下面的代码从 TABLE_NAME1 中检索与货币值相关的列名,并将这些列放入 TABLE_NAME2

DROP TABLE IF EXISTS STAGE.DBO.TABLE_NAME2<BR>
SELECT SC.NAME AS COLUMN_NAME<BR>
,SC.COLORDER AS COLUMN_ORDINAL<BR>
,CAST(ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS SMALLINT) AS ROW_NUM<BR>
INTO STAGE.DBO.TABLE_NAME2<BR>
FROM SYSOBJECTS AS SO<BR>
INNER JOIN SYSCOLUMNS AS SC ON SO.ID = SC.ID<BR>
WHERE SO.XTYPE = \'U\'<BR>
AND SO.NAME = \'TABLE_NAME2\'<BR>
AND SC.COLORDER IN (1,3)<BR>
ORDER BY SC.COLORDER, SC.NAME<BR>

TABLE_NAME2包含以下信息

column_name column_ordinal row_num
col1Name 1 1
col2Name 3 2

我想做的事:循环遍历 TABLE_NAME1 列名,如果与 TABLE_NAME2 中的值匹配,则返回该列名并将其分配给变量。在 UPDATE TABLE 语句中使用变量将逗号 (,) 替换为点 (.)

以下是我尝试过的:将结果分配给变量

DECLARE @TABLE_NAME1 NVARCHAR(MAX)
DECLARE @TABLE_NAME2 NVARCHAR(MAX)
DECLARE @SQLQRY1 NVARCHAR(MAX)
DECLARE @LOOP1 SMALLINT
DECLARE @TABLE_ROW_COUNT1 SMALLINT
DECLARE @XTYPE1 CHAR(1)
DECLARE @COL_NAME1 NVARCHAR(MAX)
SET @TABLE_NAME1 = \'CH_IBRO_HOUSEHOLD_ACTIVITY_STG\'
SET @TABLE_NAME2 = \'STAGE.DBO.CH_IBRO_HH_ACT_COL_NAME_STG\'
SET @LOOP1 = 1
SET @XTYPE1 = \'U\'
SET @TABLE_ROW_COUNT1 =2

WHILE @LOOP1 <= @TABLE_ROW_COUNT1
BEGIN
    SET @SQLQRY1 = N\'SELECT @COL_NAME1=TBL2.COLUMN_NAME
                        FROM ( SELECT SC.[NAME] AS COL_NAME, SC.COLORDER AS COL_ORDER
                               FROM SYSOBJECTS AS SO
                               INNER JOIN SYSCOLUMNS AS SC ON SO.ID = SC.ID
                               WHERE SO.XTYPE = \'\'\'+ @XTYPE1 +\'\'\' 
                               AND SO.NAME = \'\'\'+ @TABLE_NAME1 +\'\'\'
                               ) AS TBL1
                        INNER JOIN ( SELECT *
                                     FROM \'+ @TABLE_NAME2 +\'
                               ) AS TBL2 ON TBL2.COLUMN_NAME = TBL1.COL_NAME
                               AND TBL2.COLUMN_ORDINAL = TBL1.COL_ORDER
                        WHERE TBL2.ROW_NUM = \' + CAST(@LOOP1 AS NVARCHAR(MAX))

    EXECUTE @COL_NAME1 = sp_executesql @SQLQRY1 OUTPUT


    PRINT \'COL_NAME = \'+ CAST(@COL_NAME1 AS VARCHAR);
    PRINT \'LOOP NUMBER = \'+ CAST(@LOOP1 AS VARCHAR);


    /* INCREMENT */
    SET @LOOP1 = @LOOP1 + 1
END

感谢大家的支持,因为我是 T-SQL 新手

标签: tsql


【解决方案1】:

谢谢你的文件。它帮助很大。只是想发布大多数解决方案。

第 1 步:创建临时表,其中将包含假定具有数字数据的列的名称

USE [STAGE]
DROP TABLE IF EXISTS STAGE.DBO.CH_IBRO_HOUSEHOLD_ACTIVITY_COLUMN_NAME_STG
SELECT SC.NAME AS COLUMN_NAME
,SC.COLORDER AS COLUMN_ORDINAL
,CAST(ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS SMALLINT) AS ROW_NUM
INTO STAGE.DBO.CH_IBRO_HOUSEHOLD_ACTIVITY_COLUMN_NAME_STG
FROM SYSOBJECTS AS SO
INNER JOIN SYSCOLUMNS AS SC ON SO.ID = SC.ID
WHERE SO.XTYPE = 'U' 
AND SO.NAME = 'CH_IBRO_HOUSEHOLD_ACTIVITY_STG'
AND SC.COLORDER IN (26,27,28,29,30,31,32,33,34,35,36,39,40,45,46,47,48,49,50,54,55,56,59,60,61,64,65,66,83,84)
ORDER BY SC.COLORDER, SC.NAME

第 2 步:将全局清理逻辑应用于包含数字数据的列

USE [STAGE]
DECLARE @TABLE_NAME1 NVARCHAR(MAX)
DECLARE @TABLE_NAME2 NVARCHAR(MAX)
DECLARE @SQLQRY1 NVARCHAR(MAX)
DECLARE @LOOP1 SMALLINT
DECLARE @TABLE_ROW_COUNT1 SMALLINT
DECLARE @XTYPE1 CHAR(1)
DECLARE @COL_NAME1 NVARCHAR(MAX)
SET @TABLE_NAME1 = 'CH_IBRO_HOUSEHOLD_ACTIVITY_STG'
SET @TABLE_NAME2 = 'STAGE.DBO.CH_IBRO_HOUSEHOLD_ACTIVITY_COLUMN_NAME_STG'
SET @LOOP1 = 1
SET @XTYPE1 = 'U'
SET @TABLE_ROW_COUNT1 = (SELECT COUNT(*) FROM STAGE.DBO.CH_IBRO_HOUSEHOLD_ACTIVITY_COLUMN_NAME_STG)
DECLARE @ParmDefinition nvarchar(500);
SELECT @ParmDefinition =  N'@COL_NAME1  NVARCHAR(MAX) OUTPUT';


WHILE @LOOP1 <= @TABLE_ROW_COUNT1
BEGIN
    SET @SQLQRY1 = N'SELECT @COL_NAME1=TBL2.COLUMN_NAME
                        FROM ( SELECT SC.[NAME] AS COL_NAME, SC.COLORDER AS COL_ORDER
                               FROM SYSOBJECTS AS SO
                               INNER JOIN SYSCOLUMNS AS SC ON SO.ID = SC.ID
                               WHERE SO.XTYPE = '''+ @XTYPE1 +''' 
                               AND SO.NAME = '''+ @TABLE_NAME1 +'''
                               ) AS TBL1
                        INNER JOIN ( SELECT *
                                     FROM '+ @TABLE_NAME2 +'
                               ) AS TBL2 ON TBL2.COLUMN_NAME = TBL1.COL_NAME
                               AND TBL2.COLUMN_ORDINAL = TBL1.COL_ORDER
                        WHERE TBL2.ROW_NUM = ' + CAST(@LOOP1 AS NVARCHAR(MAX))

    EXEC sp_executesql @SQLQRY1, @ParmDefinition, @COL_NAME1 OUTPUT

    PRINT 'COL_NAME = '+ CAST(@COL_NAME1 AS VARCHAR);
    PRINT 'LOOP NUMBER = '+ CAST(@LOOP1 AS VARCHAR);

    
    /* REMOVE ALL LEADING AND TRAILING SPACES */
    UPDATE STAGE.DBO.CH_IBRO_HOUSEHOLD_ACTIVITY_STG
    SET @COL_NAME1 = LTRIM(RTRIM(@COL_NAME1))

    /* REMOVE ALL ASCII CHAR (13) PRESS ENTER */
    UPDATE STAGE.DBO.CH_IBRO_HOUSEHOLD_ACTIVITY_STG
    SET @COL_NAME1 = REPLACE(@COL_NAME1,CHAR(13),'')

    /* REMOVE ALL ASCII CHAR (10) LINE FEED  */
    UPDATE STAGE.DBO.CH_IBRO_HOUSEHOLD_ACTIVITY_STG 
    SET @COL_NAME1 = REPLACE(@COL_NAME1,CHAR(10),'')

    /* REMOVE ALL ASCII CHAR (9) HORIZONTAL TAB  */
    UPDATE STAGE.DBO.CH_IBRO_HOUSEHOLD_ACTIVITY_STG 
    SET @COL_NAME1 = REPLACE(@COL_NAME1,CHAR(9),'')

    /* REMOVE ALL LEADING AND TRAILING SPACES - 2ND PASS */
    UPDATE STAGE.DBO.CH_IBRO_HOUSEHOLD_ACTIVITY_STG 
    SET @COL_NAME1 = LTRIM(RTRIM(@COL_NAME1))

    /* INCREMENT */
    SET @LOOP1 = @LOOP1 + 1
END

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多