如何按顺序执行命令/功能



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

目前,我有一个漫长的过程,将表分割成多个表,在它们和主表之间生成映射表,将PK/FK链接重新映射回主表,并从主表中删除旧的不需要的列。

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

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

当前的解决方法是突出显示下拉表并首先自己执行它,然后我可以一次执行所有

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

它可能不是最优雅的解决方案,但简单地用单引号将所有内容封装在exec块中似乎是可行的"EXEC("stuff"("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

最新更新