如何在 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 脚本中动态创建和更改?的主要内容,如果未能解决你的问题,请参考以下文章