![](/img/trans.png)
[英]How to copy a column value from one table and store the same value into another table as a row
[英]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.