我必须编写一个部署脚本,如果存储过程存在或不存在,该脚本将起作用.即如果它存在,那么我需要改变它,否则创建它.
我怎么能在sql中这样做.
我正在使用SQL Server 2005
这一年是2009年,SQL Server没有CREATE或ALTER/REPLACE.这就是我所做的.
IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_NAME = 'SynchronizeRemoteCatalog'
AND ROUTINE_SCHEMA = 'dbo'
AND ROUTINE_TYPE = 'PROCEDURE')
EXEC ('DROP PROCEDURE dbo.SynchronizeRemoteCatalog')
CREATE PROCEDURE dbo.SynchronizeRemoteCatalog
AS BEGIN
-- body
END
Run Code Online (Sandbox Code Playgroud)
对于触发器,您必须依赖于专有系统视图.
在此期间,这是最受欢迎的惯例吗?
编辑:正如n8wrl建议的那样,官方消息表明此功能不是高优先级.因此问题.
实体框架4.1 Code First非常适合创建表和关系.是否可以使用Code first方法创建sql视图或存储过程?任何关于此的指示都将受到高度赞赏.非常感谢!
我想检查是否存在存储过程列表.我希望这一切都在一个脚本中逐一完成.到目前为止我有这种格式:
USE [myDatabase]
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'sp_1')
BEGIN
CREATE PROCEDURE sp_1
AS
.................
END
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'sp_2')
BEGIN
CREATE PROCEDURE sp_2
AS
.................
END
GO
Run Code Online (Sandbox Code Playgroud)
等等.但是,我收到以下错误:
关键字"过程"附近的语法不正确.
为什么我的工作不正常呢?
IF EXISTS ( SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'LOCATION') AND type IN (N'P', N'PC'))
DROP PROCEDURE [dbo].[LOCATION]
GO
CREATE PROCEDURE [dbo].[LOCATION]
@IP NVARCHAR(100)
AS
BEGIN
DECLARE @IPNumber BIGINT
SELECT @IPNumber = dbo.ConvertIp2Num(@IP)
SELECT [country_code],[country_name]
FROM [myDatabase].[dbo].[CountryIP]
WHERE @IPNumber BETWEEN ip_from AND ip_to
END
Run Code Online (Sandbox Code Playgroud)
我有上面的代码来检查当前数据库中是否存在存储过程LOCATION.我希望它会丢弃并重新创建程序(如果存在).
但是,如果该过程存在,则代码仍在执行,因此我收到以下错误:"数据库中已存在名为"LOCATION"的对象.
为什么该代码如果存在则无法删除该程序?
相同的代码适用于同一数据库中的另一个过程.
我找到了两种方法来检查当前代码中是否存在存储过程:
if object_id('dbo.procedure_to_drop') is not null
Run Code Online (Sandbox Code Playgroud)
对比
if exists (select * from sysobjects where id = object_id('dbo.procedure_to_drop') and sysstat & 0xf = 4)
Run Code Online (Sandbox Code Playgroud)
它们之间有什么区别,哪一种是首选方式?