如何在 sql 脚本中动态创建和更改?

Posted

技术标签:

【中文标题】如何在 sql 脚本中动态创建和更改?【英文标题】:how to have dynamically create & alter in the sql script? 【发布时间】:2019-03-27 19:53:05 【问题描述】:

如何在 sql 脚本中动态创建和修改?

而不是拥有 如果退出 - 丢弃 我们希望拥有 如果退出 - 改变。

如何处理这种情况。

【问题讨论】:

我不知道你使用的是什么版本的 SQL Server,但是 2016 SP1 引入了 CREATE OR ALTER 语句support.microsoft.com/en-us/help/3190548/… 谢谢@userfl89,我刚刚注意到这个语法。我将使用 Create 或 Alter 只要确保在我提供的链接中指定的对象是允许的。例如,可以使用视图和存储过程,但不能使用表/索引。 谢谢……我会检查这些细节。这将用于过程、视图和函数.. 【参考方案1】:

为了澄清我上面的 cmets,SQL Server 2016 SP1 released CREATE OR ALTER 语句将创建一个尚不存在的对象或修改该对象(如果存在)。这仅允许在某些对象上使用,例如存储过程、触发器、函数和视图。 CREATE OR ALTER 语句不能使用已分配存储的表、索引和其他对象。另请注意,由于它们保留在磁盘上,因此不允许使用索引视图。下面是一个基本的语法示例。

CREATE OR ALTER PROCEDURE SP_TestStoredProcedure 
AS 
BEGIN
SELECT
    Column1,
    Column2,
    Column3
FROM YourTable
END

【讨论】:

当数据库中发生事务并且我们正在更改存储过程时会发生什么?该现有事务会发生什么,它是否会抛出错误(或)现有事务将根据现有脚本返回记录? 与其他 DDL 操作一样,将采用模式修改 (Sch-M) 锁,这将阻止对操作期间修改的对象的任何访问。有关此docs.microsoft.com/en-us/sql/relational-databases/… 的更多详细信息,请参阅以下文档 在此处为 2016 SP1 及更高版本投票。更好的选择。是时候让 Sql Server 赶上这个了!! 现在如果微软能得到我喜欢的 ~~only~~ 的 Oracle 特性(d)。声明 v_empkey EMPLOYEE.EMPLOYEEKEY%TYPE ***.com/questions/3790658/… @granadaCoder 好点,这对 SQL Server 肯定有用!【参考方案2】:

这是我用过的一个技巧。

-- for testing, not needed for real -- DROP PROCEDURE dbo.uspDoSomething
GO

IF NOT EXISTS ( SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'PROCEDURE' and ROUTINE_NAME =  'uspDoSomething' )
BEGIN
    EXEC ( 'CREATE PROCEDURE dbo.uspDoSomething(@i INT)     AS  BEGIN  RAISERROR (''Stubbed version'' , 16, -1) END' )
END

GO

--test only
EXEC dbo.uspDoSomething 0
GO

ALTER PROCEDURE dbo.uspDoSomething(@PatientKey INT)
AS
BEGIN
    SELECT @@VERSION
END

GO

--test only
EXEC dbo.uspDoSomething 0
GO

请记住,ALTER 不会更改您在脚本上拥有的所有权限。 DROP/ADD 需要重新应用权限。

注意,您最初并未提及您的 sql-server 版本。这个技巧适用于 2014 年及之前。显然,使用 CREATE OR ALTER 的较新版本将优于使用动态 sql 的 EXEC。

【讨论】:

我同意许可。但是,我仍然不清楚交易条款。交易是否会发生? "ALTER PROCEDURE" 是原子的。因此,恕我直言,这是一个比 drop/(re)create 更好的解决方案。 @granadaCoder 有关 SQL Server 早期版本的重要信息。 +1 希望现有交易顺利进行,不会出现任何中断。 好的!您的意思是对程序的现有调用将“完成”。我~~认为~~它实际上会(同样,ALTER 是原子的),但这必须经过测试。 #fingersCross

以上是关于如何在 sql 脚本中动态创建和更改?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 C# 动态运行 SQL Server CE [Windows mobile] 中的 SQL 脚本文件?

如何在每次创建 msi 期间动态更改 wix 中的产品版本

动态复制 SQL Server 数据的脚本

在 MySQL 中使用动态 SQL 创建游标

如何将字符串变量传递给动态sql中的where子句

如何在 SQL 中动态更改字符串的 XML 结构