gpt4 book ai didi

sql - 在SQL Server上运行条件DDL语句

转载 作者:行者123 更新时间:2023-12-04 23:43:58 25 4
gpt4 key购买 nike

我有一种情况,我想检查某个列(例如版本号),然后应用一堆ddl更改

麻烦是我无法在IF BEGIN END块中执行此操作,因为DDL语句之间需要GO分隔符,而TSQL不允许这样做。

我想知道是否有办法解决这个问题

最佳答案

您不需要使用完整的块。如果您不使用BEGIN/END(包括一个DDL语句),那么条件语句将完整执行下一条语句。如果在Pascal,C等语言中使用,则等效于的行为。当然,这意味着您将不得不一遍又一遍地重新检查您的状况。这也意味着使用变量来控制脚本的行为几乎是不可能的。

[编辑:CREATE PROCEDURE在下面的示例中不起作用,因此我将其更改为其他内容,然后将CREATE PROCEDURE移至下面进行更详细的讨论]

If ((SELECT Version FROM table WHERE... ) <= 15)
CREATE TABLE dbo.MNP (
....
)
GO

If ((SELECT Version FROM table WHERE... ) <= 15)
ALTER TABLE dbo.T1
ALTER COLUMN Field1 AS CHAR(15)
GO

...

或类似的东西,取决于您的病情。

不幸的是,CREATE/ALTER PROCEDURE和CREATE/ALTER VIEW有特殊的要求,这使得使用起来更加困难。它们几乎必须是语句中的唯一内容,因此您根本无法将它们与IF结合使用。

在许多情况下,当您要“升级”对象时,可以将其作为有条件的放置操作,然后进行创建:
IF(EXISTS(SELECT * FROM sys.objects WHERE type='p' AND object_id = OBJECT_ID('dbo.abc')))
DROP PROCEDURE dbo.abc
GO

CREATE PROCEDURE dbo.abc
AS
...
GO

如果您确实确实需要条件逻辑来决定要做什么,那么我知道的唯一方法是使用EXECUTE作为字符串运行DDL语句。
If ((SELECT Version FROM table WHERE... ) <= 15)
EXECUTE 'CREATE PROC dbo.abc
AS
....
')

但这是非常痛苦的。您必须转义该过程主体中的所有引号,并且确实很难阅读。

根据您需要应用的更改,您可以看到所有这些操作都会变得非常难看。上面的代码甚至不包括错误检查,这本身就是一种皇家痛苦。这就是为什么成群的工具制造商通过找出使部署脚本的创建自动化的方法来谋生的原因。

对不起;没有简单的“正确”方法可以适用于所有情况。这只是TSQL支持非常差的东西。尽管如此,以上应该是一个好的开始。

关于sql - 在SQL Server上运行条件DDL语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/723634/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com