sqlserver创建一个新表,求助

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqlserver创建一个新表,求助相关的知识,希望对你有一定的参考价值。

两张表中不同列求和的值作为新表的同一列,
如:取A表中的sum(a1)和B表中的sum(b2)作为新表中的c1列
怎么写语句?
c1不是sum(a1)+sum(b1),意思c1的第一行是sum(a1),第二行是sum(b1)
两人的回答都能实现,但我还想实现a1或者b1的某一值改变,c1也跟着改变?能解决追加100分...

参考技术A 想实现a1或者b1的某一值改变,c1也跟着改变,只能用触发器了。给A和B都分别加上增、删、改的触发器,当A或B的数据发生变化时,把最新的数据更新到C表。
毕竟sqlserver不是excel没有那么傻瓜化的操作
参考技术B DECLARE @Temps TABLE(a1 smallint,b1 smallint)
INSERT INTO @Temps
SELECT sum(a1),sum(b2)
FROM A,B
SELECT a1,b1 FROM @Temps
参考技术C 那就这样吧
insert into c(val) select sum(a1) from A
insert into c(val) select sum(b2) from B本回答被提问者采纳
参考技术D select sum(a1) as c1
into 新表
from a
union all
select sum(b2)
from b
第5个回答  2010-06-02 如 偷窥天道 说的,如果要实现a1或b1改变时C1也跟着改变的话,得加触发器了。。

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

【中文标题】运行 Select-into 命令为特定列的每个 UNIQUE 值创建一个新表【英文标题】:Run a Select-into command to create a new table for each UNIQUE value of a particular column 【发布时间】:2018-06-19 11:48:00 【问题描述】:

我在 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 - 这是我拥有的表格和要实现的预期结果表格的描述。

【问题讨论】:

您的代码 sn-p 将创建一个名为 dbo.New_Table_@Group 的新表,但在每次迭代时删除并重新创建它。您需要为您的任务使用动态 SQL。见sommarskog.se/dynamic_sql.html。 @DanGuzman 我查看了您建议的链接,但我无法弄清楚,因为这对我来说非常新。我知道何时不使用我使用变量但找不到(或我不明白)如何在类似于我的场景中使用它的方式。 【参考方案1】:

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;
GO

【讨论】:

非常感谢,丹!现在这完全按照我想要的方式工作。再次感谢。 Dan,最近我观察到这并不是一次性为所有值创建表。我把它放在一个存储过程中,并在页面加载时从应用程序调用这个存储过程。所以看来我必须加载页面 2-3 次才能创建表格。即使在那之后,有时,我注意到表 1 或 2 的值仍然被遗漏或创建时没有值。为什么会发生这种情况?如何解决这个问题? @Shreesha,我测试了 T-SQL 代码,它按 SSMS 的预期工作。删除PRINT 语句(仅用于调试)并在您的存储过程中添加SET NOCOUNT ON(如果您还没有这样做的话)。这将避免 DONE_IN_PROC (rowcount) 消息来自混淆应用程序,这些应用程序不处理返回的所有结果集并阻止 proc 运行完成。

以上是关于sqlserver创建一个新表,求助的主要内容,如果未能解决你的问题,请参考以下文章

求助,sqlserver2005存储过程如何返回这样的结果集

SQLSERVER2000 怎样将一个查询结果,并将结果写入一个新表

sqlserver填空题求助

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

sqlserver 存储过程 菜鸟求助 非技术性问题很简单

SQL求助:想创建一个表,但在创建前先判断是不是存在。如存在就删除它,不存在就创建。