SQL 多表根据列名返回数据的方法
SQL method for returning data from multiple tables based on column names
我正在尝试做一些有点奇怪的事情,但无法找到完成它的正确方法。本质上,我试图拉出所有 tables/views 和列名称类似于某个字符串的列。除此之外,我想从 table/view 和列组合中提取 1 行数据。第二部分是我迷路的地方。我知道我可以使用下面的 select 语句提取必要的 tables/views 和列。
SELECT COLUMN_NAME AS 'ColumnName'
,TABLE_NAME AS 'TableName'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%email%'
ORDER BY TableName,ColumnName;
所以我得到类似下面的东西
|ColumnName |TableName |
|emailAddress |all_emails |
....
但我想得到这样的东西:
|ColumnName |TableName |Example |
|emailAddress |all_emails |first.last@gmail.com|
....
任何人都可以提供任何见解吗?
我想不出在查询中执行此操作的简单方法,但这里有一个选项...
将列的列表和 tables 放入一个临时 table 和 运行 它们通过一个循环,使用动态 SQL 到 select每个的最大行数。
我在下面添加了很多评论来解释它。
DECLARE @SQL NVARCHAR(1000)
DECLARE @TABLE NVARCHAR(1000)
DECLARE @COLUMN NVARCHAR(1000)
DECLARE @SAMPLE NVARCHAR(1000)
DROP TABLE IF EXISTS ##TABLELIST
SELECT COLUMN_NAME AS 'ColumnName'
,TABLE_NAME AS 'TableName'
,ROW_NUMBER() OVER (ORDER BY COLUMN_NAME,TABLE_NAME)[RN]
INTO ##TABLELIST
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%email%';
ALTER TABLE ##TABLELIST
ADD [Sample] NVARCHAR(1000) -- Add a column for your sample row.
DECLARE @ROWCOUNTER INT = 1 -- Add a counter for the loop to use.
WHILE @ROWCOUNTER <= (SELECT MAX([RN]) FROM ##TABLELIST) -- Keep the loop running until the end of the list.
BEGIN
UPDATE ##TABLELIST
SET @TABLE = TableName WHERE [RN] = @ROWCOUNTER -- Get the table name into a variable.
UPDATE ##TABLELIST
SET @COLUMN = ColumnName WHERE [RN] = @ROWCOUNTER -- Get the column name into a variable.
SET @SQL = 'SELECT @SAMPLE = MAX([' + @COLUMN + ']) FROM [' + @TABLE + ']' -- Create SQL statement to pull max column from table specified in variables.
EXEC SP_EXECUTESQL @SQL, N'@SAMPLE NVARCHAR(1000) OUTPUT', @SAMPLE OUTPUT -- Execute SQL and put the output into the @SAMPLE variable.
UPDATE ##TABLELIST
SET [Sample] = CAST(@SAMPLE AS NVARCHAR(1000)) WHERE [RN] = @ROWCOUNTER -- Insert the SQL output into the sample column.
SET @ROWCOUNTER = @ROWCOUNTER+1 -- Add one to the row counter to move to the next column and table.
END
SELECT * FROM ##TABLELIST -- Select final output.
我正在尝试做一些有点奇怪的事情,但无法找到完成它的正确方法。本质上,我试图拉出所有 tables/views 和列名称类似于某个字符串的列。除此之外,我想从 table/view 和列组合中提取 1 行数据。第二部分是我迷路的地方。我知道我可以使用下面的 select 语句提取必要的 tables/views 和列。
SELECT COLUMN_NAME AS 'ColumnName'
,TABLE_NAME AS 'TableName'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%email%'
ORDER BY TableName,ColumnName;
所以我得到类似下面的东西
|ColumnName |TableName |
|emailAddress |all_emails |
....
但我想得到这样的东西:
|ColumnName |TableName |Example |
|emailAddress |all_emails |first.last@gmail.com|
....
任何人都可以提供任何见解吗?
我想不出在查询中执行此操作的简单方法,但这里有一个选项...
将列的列表和 tables 放入一个临时 table 和 运行 它们通过一个循环,使用动态 SQL 到 select每个的最大行数。
我在下面添加了很多评论来解释它。
DECLARE @SQL NVARCHAR(1000)
DECLARE @TABLE NVARCHAR(1000)
DECLARE @COLUMN NVARCHAR(1000)
DECLARE @SAMPLE NVARCHAR(1000)
DROP TABLE IF EXISTS ##TABLELIST
SELECT COLUMN_NAME AS 'ColumnName'
,TABLE_NAME AS 'TableName'
,ROW_NUMBER() OVER (ORDER BY COLUMN_NAME,TABLE_NAME)[RN]
INTO ##TABLELIST
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%email%';
ALTER TABLE ##TABLELIST
ADD [Sample] NVARCHAR(1000) -- Add a column for your sample row.
DECLARE @ROWCOUNTER INT = 1 -- Add a counter for the loop to use.
WHILE @ROWCOUNTER <= (SELECT MAX([RN]) FROM ##TABLELIST) -- Keep the loop running until the end of the list.
BEGIN
UPDATE ##TABLELIST
SET @TABLE = TableName WHERE [RN] = @ROWCOUNTER -- Get the table name into a variable.
UPDATE ##TABLELIST
SET @COLUMN = ColumnName WHERE [RN] = @ROWCOUNTER -- Get the column name into a variable.
SET @SQL = 'SELECT @SAMPLE = MAX([' + @COLUMN + ']) FROM [' + @TABLE + ']' -- Create SQL statement to pull max column from table specified in variables.
EXEC SP_EXECUTESQL @SQL, N'@SAMPLE NVARCHAR(1000) OUTPUT', @SAMPLE OUTPUT -- Execute SQL and put the output into the @SAMPLE variable.
UPDATE ##TABLELIST
SET [Sample] = CAST(@SAMPLE AS NVARCHAR(1000)) WHERE [RN] = @ROWCOUNTER -- Insert the SQL output into the sample column.
SET @ROWCOUNTER = @ROWCOUNTER+1 -- Add one to the row counter to move to the next column and table.
END
SELECT * FROM ##TABLELIST -- Select final output.