[英]How to join a table where the table name is stored as a column value in another table?
[英]How to retrieve a column name from a table that is stored as a value in another table
我對 sql 很陌生,所以任何幫助都將不勝感激
我有一個表,其中包含表列中的表名列表,我需要從列出的所有表中檢索一個名為 [Last Refreshed] 的列。 這些表都有不同的結構,但它們都有 [Last Refreshed] 列。 我已經設法將表名插入到 sql 變量中,但到目前為止我有點卡住了。 我希望我設法解釋了我需要什么,但我也附上了我的代碼。
Declare @tables nvarchar(max)
Declare @sql nvarchar(max)
Declare @cnt int
DECLARE @Counter int
SET @Counter = 1
DECLARE @RowCount INT
SET @RowCount = (SELECT COUNT(*)
FROM (
SELECT * FROM TABLE_LIST1
UNION
SELECT * FROM TABLE_LIST2) data )
DROP TABLE #DB_DUMMY
CREATE TABLE #DB_DUMMY (
[TABLENAME] VARCHAR(512),
[LAST_REFRESHED] VARCHAR(533)
);
WHILE ( @Counter <= @RowCount)
BEGIN
SELECT @tables = FinalTable, @cnt = Row_num from (
SELECT FinalTable , ROW_NUMBER() OVER(ORDER BY FinalTable DESC) AS Row_num
FROM (
SELECT FinalTable FROM TABLE_LIST1
UNION
SELECT FinalTable FROM ABLE_LIST2) data
group by FinalTable) a
where Row_num = @Counter
--This part doesnt work
INSERT INTO #DB_DUMMY(TABLENAME,LAST_REFRESHED)
SELECT @tables , [Last Refreshed] from @tables
SET @Counter = @Counter + 1
END
exec(@sql)
我希望在臨時表#DB_DUMMY 中看到表名列表以及最后一次刷新
只是一個建議您可以使用 INSERT SELECT
INSERT INTO #DB_DUMMY(TABLENAME,LAST_REFRESHED)
SELECT 'TABLE_LIST1', LAST_REFRESHED
FROM TABLE_LIST1
UNION ALL
SELECT 'TABLE_LIST2', LAST_REFRESHED
FROM TABLE_LIST2
UNION ALL
.....
SELECT 'TABLE_LISTN', LAST_REFRESHED
FROM TABLE_LISTN
嘗試這樣的事情:
declare cur cursor for Select TableName From TABLE_LIST
declare @tablename nvarchar(max)
declare @sqlstring nvarchar(max)
open cur
fetch next from cur into @tablename
while @@fetch_status=0
begin
set @sqlstring = 'SELECT ''' + @tablename + ''' AS ''TABLE'', [LAST_REFRESHED] FROM ' + @tablename
exec sp_executesql @sqlstring
fetch next from cur into @tablename
end
close cur
deallocate cur
;
現在是周末,我無法訪問數據庫進行測試,因此可能需要進行一些調整。 這是示例代碼的小提琴,但它只返回第一個表http://sqlfiddle.com/#!18/a5b55b/2 (我認為小提琴執行機制會干擾 cursor。)
此答案基於此處的代碼: 我在多個表中有相同的列,並希望將所有表中的該列更新為特定值。 我怎樣才能做到這一點?
請注意,無需維護包含該列的表列表。 您可以從 INFORMATION_SCHEMA.COLUMNS 動態生成它
另一種可能的方法是生成並執行動態語句(不能使用變量作為列或表的名稱):
桌子:
CREATE TABLE #TableNames (
[TableName] nvarchar(128)
)
INSERT INTO #TableNames
([TableName])
VALUES
(N'Table1'),
(N'Table2'),
(N'Table3'),
(N'Table4'),
(N'Table5')
陳述:
-- Generate statement
DECLARE @stm nvarchar(max) = N''
SELECT @stm = CONCAT(
@stm,
N'INSERT INTO #DB_DUMMY (TABLENAME, LAST_REFRESHED) ',
N'SELECT ''',
[TableName],
N''' AS [TableName], [LastRefreshed] FROM ',
QUOTENAME([TableName]),
N'; '
)
FROM #TableNames
-- Execute statement
PRINT @stm
EXEC sp_executesql @stm
我將[Last Refreshed]
列添加到我的表中並編寫此查詢並給我正確的答案
DROP TABLE IF EXISTS #DB_DUMMY
CREATE TABLE #DB_DUMMY (
[TABLENAME] VARCHAR(512),
[LAST_REFRESHED] VARCHAR(533)
);
DECLARE @COMMAND NVARCHAR(MAX)
SELECT @COMMAND = STRING_AGG(' INSERT INTO #DB_DUMMY SELECT DISTINCT '+CHAR(39)+T.name+CHAR(39)+',['+C.name+'] FROM '+S.name+'.'+T.name + ' GO', CHAR(13)+CHAR(10))
FROM sys.all_columns C
INNER JOIN sys.tables T ON C.object_id = T.object_id
INNER JOIN sys.schemas S ON T.schema_id = S.schema_id
WHERE C.name = 'Last Refreshed'
PRINT(@COMMAND)
EXEC(@COMMAND)
SELECT * FROM #DB_DUMMY
IF EXISTS
的兩個第一行是 sql 服務器 2017 中的新語法
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.