[英]Select table with name from column value
我有這個SQL查詢
SELECT table_name
INTO #LukaTestTable
FROM information_schema.columns
WHERE column_name = 'GUID'
ORDER BY TABLE_NAME ;
如何在所有表中使用TABLE_NAME的名稱獲取GUID列的值?
還是可以得到像這樣的桌子?
TABLE_NAME GUID_VALUE
為了能夠在查詢表之前知道表,您必須使用動態查詢。 如果您有任意數量的表,則在SQL Server中,可以使用游標實現此目的:
DECLARE
@column VARCHAR(256) = 'GUID',
@table VARCHAR(256),
@query VARCHAR(4000);
DECLARE #Tables CURSOR LOCAL FAST_FORWARD
FOR
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME = @column
ORDER BY TABLE_NAME;
OPEN #Tables
FETCH NEXT FROM #Tables INTO @table
WHILE @@FETCH_STATUS = 0
BEGIN
SET @query = 'SELECT ' + @column + ' FROM ' + @table
EXEC(@query)
FETCH NEXT FROM #Tables INTO @table
END
CLOSE #Tables
DEALLOCATE #Tables;
如果確定您的“ GUID”列具有相同的數據類型-您可以創建一個臨時表並在WHILE循環中插入到該表中,並在最后一次選擇所有內容。
您可以像這樣使用動態sql:
declare @sql varchar(max) = cast (' ' as varchar(max));
select @sql = @sql +
(select ' select GUID from ' + quotename(table_name) + ' union all ' as 'text()'
from #LukaTestTable
for xml path(''));
set @sql = reverse(stuff(reverse(@sql), 1, 10, ''));
--print @sql
exec(@sql);
如果您希望table_name作為單獨的列,則應首先將其保存在#LukaTestTable
使用While循環和動態Sql嘗試以下腳本
IF OBJECT_ID('tempdb..#GetSqlQuery') IS NOT NULL
DROP TABLE #GetSqlQuery
IF OBJECT_ID('tempdb..#GetSpecficcolumnvalue') IS NOT NULL
DROP TABLE #GetSpecficcolumnvalue
GO
CREATE TABLE #GetSqlQuery
(
ID INT IDENTITY
,SELECtQuery nvarchar(max)
,TableName varchar(200)
)
CREATE TABLE #GetSpecficcolumnvalue
(
ID INT IDENTITY
,GetValue nvarchar(max)
,TableName varchar(200)
)
INSERT INTO #GetSqlQuery(SELECtQuery,TableName)
SELECT 'SELECT GUID,'''+TABLE_NAME+''' As TableName FROM '+QUOTENAME(TABLE_NAME) AS SELECtQuery,QUOTENAME(TABLE_NAME) AS TableName
FROM(
SELECT
TABLE_SCHEMA,
TABLE_NAME,
COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME ='GUID'
)dt
ORDER BY TABLE_NAME
DEclare @MinId INt,@MaxId INT,@Sql nvarchar(maX),@TableName varchar(1000)
SELECT @MinId =MIN(Id),@MaxId=MAX(ID) FROM #GetSqlQuery
WHILE (@MinId<=@MaxId)
BEgin
SELECT @Sql=SELECtQuery ,@TableName=TableName From #GetSqlQuery WHERE ID=@MinId
PRINT @Sql
INSERT INTO #GetSpecficcolumnvalue(GetValue,TableName)
EXEC (@Sql)
SET @MinId=@MinId+1
END
SELECT ROW_NUMBER()OVER(ORDER BY (SELECT 1)) AS Seq,GetValue,TableName
FROM
(
SELECT *, ROW_NUMBER ()OVER(PArtition by GetValue,TableName ORDER BY
TableName) AS dup FROM #GetSpecficcolumnvalue
)dt where dt.dup=1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.