簡體   English   中英

如何將一個表中的每一行復制到另一個表中

[英]How to store copy each row from one table into another table

我有一個存儲過程,它掃描我的數據庫中的所有表以查找特定列(代碼值)。 然后它打印該列及其所屬表的不同值。每列可以屬於許多表。 即codeX可以在表A和表B中找到。

ActualCode in TableA

ActualCode
----------
0
1
2

(3 row(s) affected)

--------------------
ActualCode in TableB

ActualCode
----------
 0

(1 row(s) affected)

我試圖弄清楚如何掃描結果中的每一行,然后將該行插入到新數據庫中的新表中。 例如,我想從下面為 TableA 抓取 0,然后在新表中插入一行並存儲 Value(0) 和表名 (TableA)

然后對值 1...2 等執行相同的操作,然后對下一個表重復相同的操作。

我的查詢是這樣的:

 DECLARE cursorColumnNames CURSOR FOR SELECT DISTINCT COLUMN_NAME, TABLE_NAME FROM 
 INFORMATION_SCHEMA.COLUMNS
 WHERE COLUMN_NAME LIKE '%ActualCode%' AND TABLE_CATALOG = 'db1' AND  COLUMN_NAME NOT 
 IN(select  ColumnName from [DataDictionary].[dbo].[Code])

 OPEN cursorColumnNames
 FETCH NEXT FROM cursorColumnNames INTO @columnName, @tableName;
  WHILE @@FETCH_STATUS = 0
    BEGIN
        PRINT @columnName + ' in ' + @tableName;
        PRINT '  '
        SET @SqlQuery = 'SELECT  DISTINCT '  + @columnName  + ' FROM ' + @tableName;
        EXEC (@SqlQuery);
        PRINT '--------------------'
        FETCH NEXT FROM cursorColumnNames INTO @columnName, @tableName;
    END;

CLOSE cursorColumnNames;
DEALLOCATE cursorColumnNames;

我嘗試獲取每個前 1 個值,然后添加並重復,直到所有數據都已傳輸。 但是我的查詢查找不在第二個數據庫中的列,因此在第一次迭代后,我的查詢返回 0 條記錄。

所以我很困惑該怎么做或嘗試。

我不想創建新表,該表已經存在。 我要添加各個行的表定義如下:

  CodeInsertID      TableName   ColumnName  CodeNo
  4648              TableA      ActualCode  0
  4647              TableA      ActualCode  1
  4646              TableA      ActualCode  2
  4645              TableB      ActualCode  0

你可以試試這樣嗎? 它為我工作。

Declare @SqlQuery nvarchar(max),
@columnName nvarchar(50),
@tableName nvarchar(50)

Declare @table table (TableName nvarchar(50) , ColumnName nvarchar(50) , CodeNo int)

DECLARE cursorColumnNames CURSOR FOR SELECT DISTINCT COLUMN_NAME, TABLE_NAME FROM 
INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%ActualCode%' AND TABLE_CATALOG = 'db1' AND  COLUMN_NAME NOT 
IN(select  ColumnName from [DataDictionary].[dbo].[Code])


OPEN cursorColumnNames
FETCH NEXT FROM cursorColumnNames INTO @columnName, @tableName;

WHILE @@FETCH_STATUS = 0
BEGIN
    --PRINT @columnName + ' in ' + @tableName;
    --PRINT '  '
    SET @SqlQuery = 'SELECT  DISTINCT ''' + @tablename+ ''', '''+ @columnName+ ''' , ' + @columnName + ' FROM  [' + @tableName + ']';
    PRINT @SqlQuery
    INSERT INTO @table (TableName,ColumnName,CodeNo)
    EXEC (@SqlQuery);
    --PRINT '--------------------'
    FETCH NEXT FROM cursorColumnNames INTO @columnName, @tableName;
END;

CLOSE cursorColumnNames;
DEALLOCATE cursorColumnNames;

SELECT * from @table

光標真的很慢,你可以在一個動態語句中做到這一點,我們可以一口氣構建。

您還需要使用QUOTENAME引用列名和表名,否則您的代碼可能無法正常工作。

注意:要轉義字符串中的單引號' ,請使用'' 不要混淆哪個代碼是動態部分的一部分,哪個部分是 static。

DECLARE @sql nvarchar(max) =
N'INSERT INTO myTABLE (TableName, ColumnName, CodeNo)
' +

(SELECT STRING_AGG(

    N'SELECT 
    N' + QUOTENAME(t.name, '''') + N',
    N' + QUOTENAME(c.name, '''') + N',
    CAST(' + QUOTENAME(c.name) + N' AS nvarchar(max))    -- or whatever your column type is here
  FROM db1.' + QUOTENAME(s.name) + N'.' + QUOTENAME(t.name),

  CAST(N'
UNION ALL
' AS nvarchar(max))

FROM db1.sys.tables t
JOIN db1.sys.schemas s ON s.schema_id = t.schema_id
JOIN db1.sys.columns c ON c.object_id = t.object_id
WHERE c.name LIKE N'%ActualCode%'
    AND c.name NOT IN (SELECT ColumnName FROM [DataDictionary].[dbo].[Code])
);

-- PRINT @sql; -- for testing

EXEC sp_executesql @sql;

你說你只有 SQL Server 2014,所以你必須使用 cursor 或FOR XML PATH 您仍然可以構建查詢,然后一次性執行它:

DECLARE @sql nvarchar(max) =
N'INSERT INTO myTABLE (TableName, ColumnName, CodeNo)
';

DECLARE @cur CURSOR;
SET @cur = CURSOR FAST_FORWARD FOR 
SELECT 

    N'SELECT 
    N' + QUOTENAME(t.name, '''') + N',
    N' + QUOTENAME(c.name, '''') + N',
    CAST(' + QUOTENAME(c.name) + N' AS nvarchar(max))    -- or whatever your column type is here
  FROM db1.' + QUOTENAME(s.name) + N'.' + QUOTENAME(t.name)

FROM db1.sys.tables t
JOIN db1.sys.schemas s ON s.schema_id = t.schema_id
JOIN db1.sys.columns c ON c.object_id = t.object_id
WHERE c.name LIKE N'%ActualCode%'
    AND c.name NOT IN (SELECT ColumnName FROM [DataDictionary].[dbo].[Code])
;

OPEN @cur;

DECLARE @tableSql nvarchar(max);

FETCH NEXT FROM @cur INTO @tableSql;
SET @sql = @sql + @tableSql;

WHILE (@@FETCH_STATUS = 0)
BEGIN
    FETCH NEXT FROM @cur INTO @tableSql;
    SET @sql = @sql + N'
UNION ALL
' + @tableSql;
END;

-- PRINT @sql; -- for testing

EXEC sp_executesql @sql;

無需關閉或解除分配,因為它是一個局部變量,將在批處理結束時自動關閉

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM