SELECT 来自表名
SELECT FROM TABLES NAME LIKE
我在 SQL 服务器数据库 (SSMS) 中有 1000 个 table,我想将 1000 个 table 中的选定列放入 1 个新的 table。
我想做这样的事情
创建一个包含 a、b、c 列的新 table
确定要从中选择数据的 1000 tables - table 根据通配符之类的内容选择名称。
在数据库中,有很多 tables 和名字都遵循类似的模式,例如ABC_0001
, ABC_0002
... ABC_1000
, XYZ_0001
, XYZ_0002
, ... XYZ_1000
等...我只想要 tables 以 ABC
开始被选中..
Select 1000 table 中的 a、b、c 列,并将值插入在步骤 #1
中创建的 table
我是这样做的:
SELECT a, b, c FROM ABC_0001 UNION_ALL
SELECT a, b, c FROM ABC_0002 UNION_ALL
SELECT a, b, c FROM ABC_1000
INSERT INTO NEW_TABLE
并想做类似
的事情
SELECT a, b, c FROM TABLE LIKE ABC_%
INSERT INTO NEW_TABLE
您可以执行以下操作:
-- use 'UNION' to select only distinct values, and UNION ALL if you want to select all rows
SELECT *
INTO [NEW_TABLE]
FROM ABC_001
UNION ALL
SELECT * FROM ABC_002
UNION ALL
SELECT * FROM ABC_003
UNION ALL
-- and so on...
SELECT * FROM ABC_999
-- there's no need to use UNION on the last select
如果您真的不想键入所有 999+ 表,您可以从名称与您想要的模式相匹配的表中编写一个存储过程到 select。
参考文献:
https://www.w3schools.com/sql/sql_ref_union.asp
SELECT INTO USING UNION QUERY
SQL Server select data from 100+ tables
你可以用Dynamic SQL
和CURSOR OR WHILE LOOP
来实现,我是用CURSOR
实现的。如果您不想在新的 table.
中插入重复条目,请使用 UNION
而不是 UNION ALL
DROP TABLE IF EXISTS TABLE_NEW
CREATE TABLE TABLE_NEW (A VARCHAR,B VARCHAR, C VARCHAR) -- Modify according to your need
DECLARE @Sql NVARCHAR(MAX) = ''
,@TableName VARCHAR(500)
,@Id INT
DECLARE Table_Cursor CURSOR FOR
SELECT
ROW_NUMBER() OVER (ORDER BY TABLE_NAME ASC) Id
,TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
AND TABLE_NAME LIKE 'ABC_%'
OPEN Table_Cursor
FETCH NEXT FROM Table_Cursor INTO @Id,@TableName
WHILE @@FETCH_STATUS = 0
BEGIN
IF(@Id = 1)
BEGIN
SET @Sql = @Sql + 'SELECT A, B, C FROM '+@TableName ----Modify the columns based on your column names
SELECT @SQL
END
ELSE
BEGIN
SET @Sql = @Sql + ' UNION ALL SELECT A, B, C FROM '+@TableName --Modify the columns based on your column names
END
FETCH NEXT FROM Table_Cursor INTO @Id,@TableName
END
CLOSE Table_Cursor
DEALLOCATE Table_Cursor
INSERT INTO NEW_TABLE
EXEC (@Sql)
根据您的新要求添加了以下答案。您可以检查 column
是否出现在 table
中,然后根据您得到的结果做出决定。我已经使用 IIF()
和 COL_LENGTH()
函数来实现这一点。
DROP TABLE IF EXISTS TABLE_NEW
CREATE TABLE TABLE_NEW (A VARCHAR,B VARCHAR, C VARCHAR) -- Modify according to your need
DECLARE @Sql NVARCHAR(MAX) = ''
,@TableName VARCHAR(500)
,@Id INT
DECLARE Table_Cursor CURSOR FOR
SELECT
ROW_NUMBER() OVER (ORDER BY TABLE_NAME ASC) Id
,TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
AND TABLE_NAME LIKE 'Temp%'
OPEN Table_Cursor
FETCH NEXT FROM Table_Cursor INTO @Id,@TableName
WHILE @@FETCH_STATUS = 0
BEGIN
--Declare variables for all your columns here and assign the column name as the value
DECLARE @A VARCHAR(100) = 'A', @B VARCHAR(100) = 'B',@C VARCHAR(100) = 'C'
SELECT @A = IIF(COL_LENGTH(@TableName, @A)>0,@A,'NULL')
SELECT @B = IIF(COL_LENGTH(@TableName, @B)>0,@B,'NULL')
SELECT @C = IIF(COL_LENGTH(@TableName, @C)>0,@C,'NULL')
IF(@Id = 1)
BEGIN
SET @Sql = @Sql + 'SELECT '+@A+' AS A, '+@B+' AS B, '+@C+' AS C FROM '+@TableName ----Modify the columns based on your column names
SELECT @A AS A
END
ELSE
BEGIN
SET @Sql = @Sql + ' UNION ALL SELECT '+@A+' AS A, '+@B+' AS B, '+@C+' AS C FROM '+@TableName --Modify the columns based on your column names
END
FETCH NEXT FROM Table_Cursor INTO @Id,@TableName
END
CLOSE Table_Cursor
DEALLOCATE Table_Cursor
INSERT INTO TABLE_NEW
SELECT @SQL
我在 SQL 服务器数据库 (SSMS) 中有 1000 个 table,我想将 1000 个 table 中的选定列放入 1 个新的 table。
我想做这样的事情
创建一个包含 a、b、c 列的新 table
确定要从中选择数据的 1000 tables - table 根据通配符之类的内容选择名称。
在数据库中,有很多 tables 和名字都遵循类似的模式,例如
ABC_0001
,ABC_0002
...ABC_1000
,XYZ_0001
,XYZ_0002
, ...XYZ_1000
等...我只想要 tables 以ABC
开始被选中..Select 1000 table 中的 a、b、c 列,并将值插入在步骤 #1
中创建的 table
我是这样做的:
SELECT a, b, c FROM ABC_0001 UNION_ALL
SELECT a, b, c FROM ABC_0002 UNION_ALL
SELECT a, b, c FROM ABC_1000
INSERT INTO NEW_TABLE
并想做类似
的事情SELECT a, b, c FROM TABLE LIKE ABC_%
INSERT INTO NEW_TABLE
您可以执行以下操作:
-- use 'UNION' to select only distinct values, and UNION ALL if you want to select all rows
SELECT *
INTO [NEW_TABLE]
FROM ABC_001
UNION ALL
SELECT * FROM ABC_002
UNION ALL
SELECT * FROM ABC_003
UNION ALL
-- and so on...
SELECT * FROM ABC_999
-- there's no need to use UNION on the last select
如果您真的不想键入所有 999+ 表,您可以从名称与您想要的模式相匹配的表中编写一个存储过程到 select。
参考文献:
https://www.w3schools.com/sql/sql_ref_union.asp
SELECT INTO USING UNION QUERY
SQL Server select data from 100+ tables
你可以用Dynamic SQL
和CURSOR OR WHILE LOOP
来实现,我是用CURSOR
实现的。如果您不想在新的 table.
UNION
而不是 UNION ALL
DROP TABLE IF EXISTS TABLE_NEW
CREATE TABLE TABLE_NEW (A VARCHAR,B VARCHAR, C VARCHAR) -- Modify according to your need
DECLARE @Sql NVARCHAR(MAX) = ''
,@TableName VARCHAR(500)
,@Id INT
DECLARE Table_Cursor CURSOR FOR
SELECT
ROW_NUMBER() OVER (ORDER BY TABLE_NAME ASC) Id
,TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
AND TABLE_NAME LIKE 'ABC_%'
OPEN Table_Cursor
FETCH NEXT FROM Table_Cursor INTO @Id,@TableName
WHILE @@FETCH_STATUS = 0
BEGIN
IF(@Id = 1)
BEGIN
SET @Sql = @Sql + 'SELECT A, B, C FROM '+@TableName ----Modify the columns based on your column names
SELECT @SQL
END
ELSE
BEGIN
SET @Sql = @Sql + ' UNION ALL SELECT A, B, C FROM '+@TableName --Modify the columns based on your column names
END
FETCH NEXT FROM Table_Cursor INTO @Id,@TableName
END
CLOSE Table_Cursor
DEALLOCATE Table_Cursor
INSERT INTO NEW_TABLE
EXEC (@Sql)
根据您的新要求添加了以下答案。您可以检查 column
是否出现在 table
中,然后根据您得到的结果做出决定。我已经使用 IIF()
和 COL_LENGTH()
函数来实现这一点。
DROP TABLE IF EXISTS TABLE_NEW
CREATE TABLE TABLE_NEW (A VARCHAR,B VARCHAR, C VARCHAR) -- Modify according to your need
DECLARE @Sql NVARCHAR(MAX) = ''
,@TableName VARCHAR(500)
,@Id INT
DECLARE Table_Cursor CURSOR FOR
SELECT
ROW_NUMBER() OVER (ORDER BY TABLE_NAME ASC) Id
,TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
AND TABLE_NAME LIKE 'Temp%'
OPEN Table_Cursor
FETCH NEXT FROM Table_Cursor INTO @Id,@TableName
WHILE @@FETCH_STATUS = 0
BEGIN
--Declare variables for all your columns here and assign the column name as the value
DECLARE @A VARCHAR(100) = 'A', @B VARCHAR(100) = 'B',@C VARCHAR(100) = 'C'
SELECT @A = IIF(COL_LENGTH(@TableName, @A)>0,@A,'NULL')
SELECT @B = IIF(COL_LENGTH(@TableName, @B)>0,@B,'NULL')
SELECT @C = IIF(COL_LENGTH(@TableName, @C)>0,@C,'NULL')
IF(@Id = 1)
BEGIN
SET @Sql = @Sql + 'SELECT '+@A+' AS A, '+@B+' AS B, '+@C+' AS C FROM '+@TableName ----Modify the columns based on your column names
SELECT @A AS A
END
ELSE
BEGIN
SET @Sql = @Sql + ' UNION ALL SELECT '+@A+' AS A, '+@B+' AS B, '+@C+' AS C FROM '+@TableName --Modify the columns based on your column names
END
FETCH NEXT FROM Table_Cursor INTO @Id,@TableName
END
CLOSE Table_Cursor
DEALLOCATE Table_Cursor
INSERT INTO TABLE_NEW
SELECT @SQL