如何按顺序执行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
我正在写一个很长的 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