首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运行Select-into命令为特定列的每个唯一值创建一个新表

运行Select-into命令为特定列的每个唯一值创建一个新表
EN

Stack Overflow用户
提问于 2018-06-19 19:48:01
回答 1查看 40关注 0票数 0

我在SQL Server数据库上有一个表,需要从该表为特定列的每个唯一值创建不同的表。

我尝试了下面的代码:

代码语言:javascript
复制
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 -这里是我所拥有的表格的描述,以及要实现的预期结果表格。

EN

回答 1

Stack Overflow用户

发布于 2018-06-22 18:38:28

T-SQL语法不允许将对象名参数化,因此您需要使用动态SQL来完成此任务。

下面的脚本展示了如何构建和执行动态脚本,以便为每个组(重新)创建表。在本例中,我使用的是游标,而不是伪游标(循环)和表变量,因为在本例中,循环没有提供游标上的值;这两种方法都是RBAR方法。

请注意,这种动态SQL方法不是例行公事,因为它可能是应用程序设计有缺陷的指示器。在这里,似乎所有组都应该有一个表,而不是单独的表,因为它们看起来是同一个实体。请参阅Erland Sommarskog的the Curse and Blessings of Dynamic SQL article了解有关此主题的详细讨论。

代码语言:javascript
复制
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;
GO
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50927688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档