如何按顺序执行命令/功能
Posted
技术标签:
【中文标题】如何按顺序执行命令/功能【英文标题】:How to execute commands/functions in order 【发布时间】:2021-07-12 22:54:37 【问题描述】:我正在编写一个长 SQL 查询,我将使用它来自动处理大型平面文件(使用 python 来扁平化大量嵌套的 JSON 文件)并将它们标准化以实现可伸缩性和 PowerBI 报告的易用性和易用性仪表板。
目前,我有一个漫长的过程,将表分割成多个表,在它们和主表之间生成映射表,将 PK/FK 链接重新映射回主表,并从主表中删除旧的不需要的列表。
我仍在构建和调试脚本,我对自己做错的事情感到非常沮丧,因为我对 SQL 不是很精通。
目前,如果我尝试一次运行我的所有代码,它将失败,说我使用了无效的列名。列名对于处于当前状态的表是无效的,但如果它只是从上到下执行,它们在到达它们时将是有效的。每次我想重新运行整个脚本时,我都必须自己突出显示并执行我的 drop tables 语句,即使我在顶部有相同的 drop tables 语句。
关于如何使脚本简单地从上到下执行或如何使其逐步执行并忽略表的“当前”状态(执行之前)的任何建议都会非常有帮助。
我所拥有的一些伪示例:
CREATE OR ALTER PROCEDURE DropTables
AS
BEGIN
DROP TABLE IF EXISTS
t1,
t2,
t3
END
GO
CREATE OR ALTER PROCEDURE GenerateTable1
AS
BEGIN
~make table~
END
GO
CREATE OR ALTER PROCEDURE GenerateTable2
BEGIN
~make table~
END
GO
CREATE OR ALTER PROCEDURE GenerateTable3
BEGIN
~make table~
ALTER TABLE t1 ADD ~fk from t3~
UPDATE t1
SET ~keys to match~
FROM t3 WHERE t1.old_col = t3.new_col
ALTER TABLE t1
DROP COLUMN old_col
END
GO
EXEC DropTables
GO
EXEC GenerateTable1
GO
EXEC GenerateTable2
GO
EXEC GenerateTable3
执行此操作时,我得到“无效的列名 old_col”,因为 old_col 当前不存在,但是,如果它只是从上到下执行,old_col 将存在成功了。
当前的解决方法是先突出显示 droptables 并自行执行,然后我可以一次执行所有内容
【问题讨论】:
为什么每次执行都需要删除和创建表?您可以使用select ... into ...
并将其用作通用表
如果您使用 #
临时表,那么它应该可以工作
【参考方案1】:
GO 将脚本分成多个批次。您只需要确定批次的范围,以便每个批次都能编译。或者使用动态 SQL,这只是发出单独批次的另一种方式。
【讨论】:
【参考方案2】:这可能不是最优雅的解决方案,但简单地将所有内容用单引号包裹在一个 exec 块中似乎是可行的。 “执行('东西');” SQL 不尝试超前,而是从上到下强制执行,例如:
CREATE OR ALTER PROCEDURE DropTables
AS
BEGIN
EXEC('
DROP TABLE IF EXISTS
t1,
t2,
t3
')
;
END
GO
CREATE OR ALTER PROCEDURE GenerateTable1
AS
BEGIN
EXEC('
~make table~
')
;
END
GO
CREATE OR ALTER PROCEDURE GenerateTable2
BEGIN
EXEC('
~make table~
')
;
END
GO
CREATE OR ALTER PROCEDURE GenerateTable3
BEGIN
EXEC('
~make table~
ALTER TABLE t1 ADD ~fk from t3~
UPDATE t1
SET ~keys to match~
FROM t3 WHERE t1.old_col = t3.new_col
ALTER TABLE t1
DROP COLUMN old_col
')
;
END
GO
EXEC DropTables
GO
EXEC GenerateTable1
GO
EXEC GenerateTable2
GO
EXEC GenerateTable3
【讨论】:
以上是关于如何按顺序执行命令/功能的主要内容,如果未能解决你的问题,请参考以下文章