簡體   English   中英

如何從存儲為另一個表中的值的表中檢索列名

[英]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.

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