for-loop - 运行 Select-into 命令为特定列的每个 UNIQUE 值创建一个新表
问题描述
我在 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
这正在执行并且没有提示任何错误,但也未能给出预期的结果。它不会创建任何新表。在执行它时显示某某行数受到影响,但是当我检查表列表时,不会创建这样的新表。
有人可以帮助达到预期的结果吗?任何帮助深表感谢。
现有表和要创建的新表的描述 - 这是我拥有的表和要实现的预期结果表的描述。
解决方案
T-SQL 语法不允许参数化对象名称,因此您需要为此任务使用动态 SQL。
下面是一个脚本,它显示了如何构建和执行动态脚本来(重新)为每个组创建一个表。在此示例中,我使用游标而不是伪游标(循环)和表变量,因为在这种情况下,循环不提供游标上的值;两者都是RBAR方法。
请注意,这种动态 SQL 方法不是例行公事,因为它可能表明应用程序设计存在缺陷。在这里,似乎所有组都应该有一个表,而不是单独的表,因为它们看起来是同一个实体。有关该主题的全面讨论,请参阅 Erland Sommarskog 的动态 SQL 的诅咒和祝福一文。
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
推荐阅读
- javascript - HTML输入只接受0-9(英文数字)和০-৯(孟加拉语数字)?
- nlog - 无法解析“Microsoft.Extensions.Logging.ILoggingBuilder”类型的服务
- c# - Swift 中的转义闭包 VS C# 中的委托类型
- r - 转换为数字类型后的值发生了变化
- python - Grafana LDAP 创建的用户无法通过 REST API 登录
- node.js - 为什么在 Node.js 12.13.0 上使用 export/import 语句时 ESLint 会抛出错误?
- javascript - express.js 如何捕获 ReferenceError
- javascript - 使用 Vue JS 的下拉列表
- bitbucket - 折叠拉取请求一操作位桶中的所有文件
- php - 将 mysql 子查询 + group by 转换为 laravel eloquent