Sql EC('CREATE PROCEDURE mySchema.myProc AS SET NOCOUNT ON;')将PROCEDURE mySchema.myProc@DeclaredParmsGoHere数据类型更改为BEGIN@rasoo我不相信您可以
Sql EC('CREATE PROCEDURE mySchema.myProc AS SET NOCOUNT ON;')将PROCEDURE mySchema.myProc@DeclaredParmsGoHere数据类型更改为BEGIN@rasoo我不相信您可以,sql,sql-server,tsql,stored-procedures,Sql,Sql Server,Tsql,Stored Procedures,EC('CREATE PROCEDURE mySchema.myProc AS SET NOCOUNT ON;')将PROCEDURE mySchema.myProc@DeclaredParmsGoHere数据类型更改为BEGIN@rasoo我不相信您可以在Sql Server中做到这一点,我想不出您想要这样做的原因。go命令分隔各个批处理命令。一旦删除一条语句,就会出现一个错误,即“alter”语句必须是批处理中的第一条语句。此外,Go使代码更易于阅读,因为它正确地表明,如果不存在该过程,则创
EC('CREATE PROCEDURE mySchema.myProc AS SET NOCOUNT ON;')将PROCEDURE mySchema.myProc@DeclaredParmsGoHere数据类型更改为BEGIN@rasoo我不相信您可以在Sql Server中做到这一点,我想不出您想要这样做的原因。go命令分隔各个批处理命令。一旦删除一条语句,就会出现一个错误,即“alter”语句必须是批处理中的第一条语句。此外,Go使代码更易于阅读,因为它正确地表明,如果不存在该过程,则创建该过程的步骤是它自己的批处理,更改该过程的步骤也是如此。但我必须这么做。我正在为c#project中的project编写sql脚本。这将在部署期间执行。而且它不支持“go”。目前我已经做了一个变通办法,创建两个独立的sql脚本文件。第一个是检查和创建。下一个是alter过程。不过,这个过程改变了过程。如果有人已经创建了它的更新版本,而现在我们正在覆盖它,该怎么办?如果程序已经存在,如何避免修改,如果不存在,如何避免创建新的程序,以避免丢失现有的程序代码?我完全不理解你的评论。上面的语句使用alter,这意味着它将更改数据库中存在的任何编译版本。如果有人创建了较新版本的proc,您应该创建较新版本的较新版本。整个要点是修改过程。我否决了这一点,因为语句的语法不正确。至少,您应该尽一点努力并测试该语句。显然,该语法对于SQL Server的现代实例是正确的(v2016,2017,…)。要摆脱撇号似乎很麻烦。
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
USE [myDatabase]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'sp_1')
BEGIN
DROP PROCEDURE sp_1
END
GO --<-- Add a Batch Separator here
CREATE PROCEDURE sp_1
AS
.................
END
GO
IF EXISTS (
SELECT type_desc, type
FROM sys.procedures WITH(NOLOCK)
WHERE NAME = 'myProc'
AND type = 'P'
)
DROP PROCEDURE dbo.myProc
GO
CREATE PROC dbo.myProc
AS
....
GO
GRANT EXECUTE ON dbo.myProc TO MyUser
BEGIN TRAN
IF EXISTS (
SELECT type_desc, type
FROM sys.procedures WITH(NOLOCK)
WHERE NAME = 'myProc'
AND type = 'P'
)
DROP PROCEDURE myProc GO
CREATE PROCEDURE myProc
AS
--proc logic here
GO
-- BEGIN DO NOT REMOVE THIS CODE (it commits or rolls back the stored procedure drop)
IF EXISTS(
SELECT 1
FROM sys.procedures WITH(NOLOCK)
WHERE NAME = 'myProc'
AND type = 'P'
)
COMMIT TRAN
ELSE
ROLLBACK TRAN
-- END DO NOT REMOVE THIS CODE
if exists (select 1 from sys.objects where object_id = object_id('dbo.yourProc'))
set noexec on
go
create procedure dbo.yourProc as
begin
select 1 as [not yet implemented]
end
go
set noexec off
alter procedure dbo.yourProc as
begin
/*body of procedure here*/
end
create or alter dbo.yourProc as
go
drop procedure if exists dbo.yourProc;
BEGIN TRY
--if procedure does not exist, create a simple version that the ALTER will replace. if it does exist, the BEGIN CATCH will eliminate any error message or batch stoppage
EXEC ('CREATE PROCEDURE AAAAAAAA AS DECLARE @A varchar(100); SET @A=ISNULL(OBJECT_NAME(@@PROCID), ''unknown'')+'' was not created!''; RAISERROR(@A,16,1);return 9999')
END TRY BEGIN CATCH END CATCH
GO
ALTER PROCEDURE AAAAAAAA
(
@ParamsHere varchar(10)
)
AS
PRINT 'HERE IN '+(OBJECT_NAME(@@PROCID))
GO
DROP PROCEDURE IF EXISTS name_of_procedure;
CREATE PROCEDURE name_of_procedure(....)
USE [MyDataBase]
GO
IF OBJECT_ID('mySchema.myProc') IS NULL
EXEC('CREATE PROCEDURE mySchema.myProc AS SET NOCOUNT ON;')
GO
ALTER PROCEDURE mySchema.myProc
@DeclaredParmsGoHere DataType
AS
BEGIN
DECLARE @AnyVariablesINeed Their DataType
SELECT myColumn FROM myTable WHERE myIndex = @IndexParm
USE [DATABASENAME]
GO
DROP PROCEDURE IF EXISTS <proc name>
GO
CREATE PROCEDURE <proc name>
AS
-- your script here
END
GO
GRANT EXECUTE ON <proc name> TO <username>
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[spGetRailItems]') AND type in (N'P', N'PC'))
BEGIN
execute ('
CREATE PROCEDURE [dbo].[spGetRailItems]
AS
BEGIN
Declare @isLiftedBagsEnable bit=1;
select @isLiftedBagsEnable=cast(DataValu as bit) from setups where scope =''Rail Setting'' and dataName = ''isLiftedBagsEnable'';
IF @isLiftedBagsEnable=1
BEGIN
IF EXISTS (SELECT * FROM ITEMCONFIG)
BEGIN
SELECT [Item],[Desc] FROM ProcData WHERE Item IN (SELECT Item FROM ItemConfig) ORDER BY [Desc]
END
ELSE
BEGIN
SELECT [Item],[Desc] FROM ProcData ORDER BY [Desc]
END
END
ELSE
BEGIN
SELECT [Item],[Desc] FROM ProcData ORDER BY [Desc]
END
END
')
END
exec spGetRailItems;