snippetsqlMinor
Create procedure in else block on SQL Server
Viewed 0 times
elsecreatesqlblockprocedureserver
Problem
I have a SQL script in which I generate a database and its tables, stored procedures, views, etc. I have used following script to generate the database and all the things.
I was able to generate tables but on stored procedure it's giving an error:
Here is the code. I have used an
After EDIT:
```
IF EXISTS(SELECT name FROM sys.databases WHERE name = 'SampleDB')
begin
PRINT 'Exist.'
end
Else
begin
CREATE DATABASE SampleDB
exec sp_dboption N'SampleDB', N'autoshrink', N'false'
exec sp_dboption N'SampleDB', N'ANSI null default', N'false'
exec sp_dboption N'SampleDB', N'recursive triggers', N'false'
exec sp_dboption N'SampleDB', N'ANSI nulls', N'false'
exec sp_dboption N'SampleDB', N'concat null yields null', N'false'
exec sp_dboption N'SampleDB', N'cursor close on commit', N'false'
exec sp_dboption N'SampleDB', N'default to local cursor', N'false'
exec sp_dboption N'SampleDB', N'quoted identifier', N'false'
exec sp_dboption N'SampleDB', N'ANSI warnings', N'false'
exec sp_dboption N'SampleDB', N'auto create statistics', N'true'
exec sp_dboption N'SampleDB', N'auto update statistics', N'true'
DECLARE @sql nvarchar(MAX)
SET @sql='
use SampleDB
CREATE TABLE [dbo].[BrandMaster] (
[BrandId] [int] IDENTITY (1, 1) CONSTRAINT [PK_BrandMaster] PRIMARY KEY NOT NULL ,
[BrandName] [nvarchar] (50) NOT NULL ,
[BrandStatus] [bit] NOT NULL
)
CREATE TABLE [dbo].[BrandProductMaster] (
[BrandProductId] [int] IDENTITY (1, 1) CONSTRAINT [PK_BrandProductMaster] PRIMARY KEY NOT NULL ,
[ProductId] [int] NOT NULL ,
[BrandId] [int] NOT NULL ,
I was able to generate tables but on stored procedure it's giving an error:
'CREATE/ALTER PROCEDURE' must be the first statement in a query batch.'Here is the code. I have used an
if/else block so can't use a go statement. I check if the database exists or not and take appropriate action. Any one has solution for it?After EDIT:
```
IF EXISTS(SELECT name FROM sys.databases WHERE name = 'SampleDB')
begin
PRINT 'Exist.'
end
Else
begin
CREATE DATABASE SampleDB
exec sp_dboption N'SampleDB', N'autoshrink', N'false'
exec sp_dboption N'SampleDB', N'ANSI null default', N'false'
exec sp_dboption N'SampleDB', N'recursive triggers', N'false'
exec sp_dboption N'SampleDB', N'ANSI nulls', N'false'
exec sp_dboption N'SampleDB', N'concat null yields null', N'false'
exec sp_dboption N'SampleDB', N'cursor close on commit', N'false'
exec sp_dboption N'SampleDB', N'default to local cursor', N'false'
exec sp_dboption N'SampleDB', N'quoted identifier', N'false'
exec sp_dboption N'SampleDB', N'ANSI warnings', N'false'
exec sp_dboption N'SampleDB', N'auto create statistics', N'true'
exec sp_dboption N'SampleDB', N'auto update statistics', N'true'
DECLARE @sql nvarchar(MAX)
SET @sql='
use SampleDB
CREATE TABLE [dbo].[BrandMaster] (
[BrandId] [int] IDENTITY (1, 1) CONSTRAINT [PK_BrandMaster] PRIMARY KEY NOT NULL ,
[BrandName] [nvarchar] (50) NOT NULL ,
[BrandStatus] [bit] NOT NULL
)
CREATE TABLE [dbo].[BrandProductMaster] (
[BrandProductId] [int] IDENTITY (1, 1) CONSTRAINT [PK_BrandProductMaster] PRIMARY KEY NOT NULL ,
[ProductId] [int] NOT NULL ,
[BrandId] [int] NOT NULL ,
Solution
I personally prefer not to do it this way myself as our company forces us to version everything we do - therefore we should know whether objects exist or not and produce a script which explicitly creates or alters objects.
That being said, if you need to do it this way then for each object type that must be executed within a batch by itself you will need to execute a separate command to alter/create them. For example:
EDIT
Based on your additional information, Max's solution will solve your problem. However, as he mentioned this is an extremely bad way of doing it as you spend more time ensuring you have quoted correctly rather than solving SQL errors.
A better way to do it, and what I was pointing to originally, would be to separate each component out into individual statements like so:
That being said, if you need to do it this way then for each object type that must be executed within a batch by itself you will need to execute a separate command to alter/create them. For example:
IF OBJECT_ID(N'dbo.my_proc',N'P') IS NULL
EXECUTE ('CREATE PROCEDURE [dbo].[my_proc] AS SELECT 1');
EXECUTE ('GRANT EXEC ON [dbo].[my_proc] TO [some_user]');
ELSE
EXECUTE ('ALTER PROCEDURE [dbo].[my_proc] AS SELECT 2');
GOEDIT
Based on your additional information, Max's solution will solve your problem. However, as he mentioned this is an extremely bad way of doing it as you spend more time ensuring you have quoted correctly rather than solving SQL errors.
A better way to do it, and what I was pointing to originally, would be to separate each component out into individual statements like so:
IF DB_ID(N'some_db') IS NOT NULL
BEGIN
PRINT 'EXISTS';
END
ELSE
BEGIN
IF OBJECT_ID(N'dbo.my_table',N'U') IS NULL
BEGIN
EXECUTE(
'CREATE TABLE [dbo].[my_table](
[id] INT IDENTITY NOT NULL,
[name] NVARCHAR(8) NOT NULL,
CONSTRAINT [pk_my_table] PRIMARY KEY([id]),
CONSTRAINT [uk_my_table_name] UNIQUE([name])
)');
END
IF OBJECT_ID(N'dbo.my_view',N'V')IS NULL
BEGIN
EXECUTE(
'CREATE VIEW [dbo].[my_view]
AS
SELECT [id],[name]
FROM [dbo].[my_table]
WHERE [name] LIKE ''A%'';'
);
END
IF OBJECT_ID(N'dbo.my_proc',N'P') IS NULL
BEGIN
EXECUTE(
'CREATE PROCEDURE [dbo].[my_proc](@id INT)
AS
SELECT [name]
FROM [dbo].[my_view]
WHERE [id] = @id;'
);
END
END
GOCode Snippets
IF OBJECT_ID(N'dbo.my_proc',N'P') IS NULL
EXECUTE ('CREATE PROCEDURE [dbo].[my_proc] AS SELECT 1');
EXECUTE ('GRANT EXEC ON [dbo].[my_proc] TO [some_user]');
ELSE
EXECUTE ('ALTER PROCEDURE [dbo].[my_proc] AS SELECT 2');
GOIF DB_ID(N'some_db') IS NOT NULL
BEGIN
PRINT 'EXISTS';
END
ELSE
BEGIN
IF OBJECT_ID(N'dbo.my_table',N'U') IS NULL
BEGIN
EXECUTE(
'CREATE TABLE [dbo].[my_table](
[id] INT IDENTITY NOT NULL,
[name] NVARCHAR(8) NOT NULL,
CONSTRAINT [pk_my_table] PRIMARY KEY([id]),
CONSTRAINT [uk_my_table_name] UNIQUE([name])
)');
END
IF OBJECT_ID(N'dbo.my_view',N'V')IS NULL
BEGIN
EXECUTE(
'CREATE VIEW [dbo].[my_view]
AS
SELECT [id],[name]
FROM [dbo].[my_table]
WHERE [name] LIKE ''A%'';'
);
END
IF OBJECT_ID(N'dbo.my_proc',N'P') IS NULL
BEGIN
EXECUTE(
'CREATE PROCEDURE [dbo].[my_proc](@id INT)
AS
SELECT [name]
FROM [dbo].[my_view]
WHERE [id] = @id;'
);
END
END
GOContext
StackExchange Database Administrators Q#35551, answer score: 5
Revisions (0)
No revisions yet.