我在SQL Server数据库上有一个表,需要从该表为特定列的每个唯一值创建不同的表。
我尝试了下面的代码:
DECLARE @i int
DECLARE @numrows int
DECLARE @indexcount int
DECLARE @Group varchar
DECLARE @temp_table TABLE (
idx smallint Primary Key IDENTITY(1,1), Group varchar(200)
)
-- populate group table
INSERT @temp_table
SELECT distinct Column_3 FROM Existing_Table
-- enumerate the table
SET @i = 1
SET @numrows = (SELECT COUNT(*) FROM @temp_table)
SET @indexcount = (SELECT MAX(idx) FROM @temp_table)
IF @numrows > 0
WHILE (@i <= @indexcount)
BEGIN
-- get the next Group primary key
SET @Group = (SELECT Group FROM @temp_table WHERE idx = @i);
IF OBJECT_ID('dbo.New_Table_@Group', 'U') IS NOT NULL
DROP TABLE dbo.New_Table_@Group;
select Column_1, Column_2
into New_Table_@Group
from Existing_Table where Column_3 = @Group;
-- increment counter for next employee
SET @i = @i + 1
END这正在执行,并且没有提示任何错误,但也没有给出预期的结果。它不会创建任何新表。当执行它时,会显示某某受影响的行数,但当我检查表的列表时,将不会创建这样的新表。
有没有人能帮我达到预期的效果?任何帮助都是非常感谢的。
depiction of existing table and new tables to be created -这里是我所拥有的表格的描述,以及要实现的预期结果表格。
发布于 2018-06-22 18:38:28
T-SQL语法不允许将对象名参数化,因此您需要使用动态SQL来完成此任务。
下面的脚本展示了如何构建和执行动态脚本,以便为每个组(重新)创建表。在本例中,我使用的是游标,而不是伪游标(循环)和表变量,因为在本例中,循环没有提供游标上的值;这两种方法都是RBAR方法。
请注意,这种动态SQL方法不是例行公事,因为它可能是应用程序设计有缺陷的指示器。在这里,似乎所有组都应该有一个表,而不是单独的表,因为它们看起来是同一个实体。请参阅Erland Sommarskog的the Curse and Blessings of Dynamic SQL article了解有关此主题的详细讨论。
DECLARE @Group varchar(200);
DECLARE @CreateTableScript nvarchar(MAX);
DECLARE groups CURSOR LOCAL FAST_FORWARD FOR
SELECT
Column_3 AS [Group]
, N'IF OBJECT_ID(N''dbo.' + QUOTENAME('New_Table_' + Column_3) + ''', ''U'') IS NOT NULL
DROP TABLE dbo.' + QUOTENAME('New_Table_' + Column_3) + ';
select Column_1, Column_2
into dbo.' + QUOTENAME('New_Table_' + Column_3) + '
from Existing_Table where Column_3 = @Group;' AS CreateTableScript
FROM (SELECT DISTINCT Column_3 FROM Existing_Table) AS groups;
OPEN groups;
WHILE 1 = 1
BEGIN
FETCH NEXT FROM groups INTO @Group, @CreateTableScript;
IF @@FETCH_STATUS = -1 BREAK;
PRINT @CreateTableScript;
EXEC sp_executesql
@CreateTableScript
, N'@Group varchar(200)'
, @Group = @Group;
END;
CLOSE groups;
DEALLOCATE groups;
GOhttps://stackoverflow.com/questions/50927688
复制相似问题