相关疑难解决方法(0)

如何检测存储过程是否已存在

我必须编写一个部署脚本,如果存储过程存在或不存在,该脚本将起作用.即如果它存在,那么我需要改变它,否则创建它.

我怎么能在sql中这样做.

我正在使用SQL Server 2005

sql stored-procedures sql-server-2005

127
推荐指数
6
解决办法
18万
查看次数

你在SQL Server中做什么来创建或改变?

这一年是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建议的那样,官方消息表明此功能不是高优先级.因此问题.

sql t-sql sql-server

61
推荐指数
5
解决办法
6万
查看次数

您可以使用Entity Framework 4.1 Code第一种方法创建sql视图/存储过程

实体框架4.1 Code First非常适合创建表和关系.是否可以使用Code first方法创建sql视图或存储过程?任何关于此的指示都将受到高度赞赏.非常感谢!

c# code-first entity-framework-4.1 ef-migrations

44
推荐指数
5
解决办法
4万
查看次数

创建存储过程(如果尚不存在)

我想检查是否存在存储过程列表.我希望这一切都在一个脚本中逐一完成.到目前为止我有这种格式:

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)

等等.但是,我收到以下错误:

关键字"过程"附近的语法不正确.

为什么我的工作不正常呢?

sql t-sql sql-server stored-procedures

22
推荐指数
6
解决办法
4万
查看次数

如果T-SQL中存在不起作用,则删除并重新创建过程

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"的对象.

为什么该代码如果存在则无法删除该程序?

相同的代码适用于同一数据库中的另一个过程.

t-sql sql-server stored-procedures

11
推荐指数
3
解决办法
4万
查看次数

"SET NOCOUNT ON"是占位符存储过程主体的不错选择吗?

这些答案(1,2),使用代码这篇文章中,建议使用的语句SET NOCOUNT ON作为临时占位符/假体的尸体将很快覆盖的存储过程.

这些答案和那篇文章都没有说明为什么 SET NOCOUNT ON被选为临时存储过程体的值.

我的问题:为什么SET NOCOUNT ON一个临时存储过程体的好选择(如果一切顺利)将在后续操作中被覆盖?还有更好的选择吗?

可能构成一个好的临时/占位符存储过程体的一些标准:

  • 如果由于某种原因ALTER,存储过程的后续操作没有按计划发生,则在运行时以明显的方式失败;
  • 很容易理解未来的开发人员维护存储过程;
  • 不会增加任何重大开销.

sql-server stored-procedures

6
推荐指数
2
解决办法
1366
查看次数

检查 SQL Server 中是否存在存储过程的不同方法

我找到了两种方法来检查当前代码中是否存在存储过程:

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)

它们之间有什么区别,哪一种是首选方式?

sql-server stored-procedures

2
推荐指数
1
解决办法
9038
查看次数