如何按顺序执行commands/functions

How to execute commands/functions in order

我正在写一个很长的 SQL 查询,我将使用它来自动执行摄取大型平面文件的过程(使用 python 来展平大量嵌套的 JSON 文件) 并对其进行规范化,以实现 PowerBI 报告和仪表板的可扩展性和易用性。

目前,我有一个很长的过程,将 table 分割成多个 table,在它们和主 table 之间生成映射 table,将 PK/FK link 重新映射回主 table 并从主 table.

中删除不需要的旧列

我仍在构建和调试脚本,我对我认为做错的事情感到非常沮丧,因为我不是很精通 SQL。

目前,如果我尝试一次 运行 我的所有代码,它会失败,说我使用了无效的列名。列名对于处于当前状态的 tables 是无效的,但是如果它只是从上到下执行,那么在到达它们时它们将是有效的。每次我想重新 运行 整个脚本时,我都必须突出显示并单独执行我的 drop tables 语句,即使我在以下位置有相同的 drop tables 语句顶部。

关于如何使脚本简单地从上到下执行或如何使其单步执行并忽略 table 的“当前”状态(执行前)的任何建议都将非常有帮助.

一些伪造的例子:

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 并先自行执行,然后我可以一次执行所有内容

GO 将脚本分成批次。您只需要确定批次的范围,以便每个批次都能编译。或者使用动态 SQL 这只是发出单独批次的不同方式。

这可能不是最优雅的解决方案,但用单引号将所有内容简单地包装在一个 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