I am writting a dynamic sql to drop and create view in different database.
So I wrote:
set @CreateViewStatement =
'
USE ['+ @DB +'];
CREATE VIEW [dbo].[MyTable]
AS
SELECT ........something
exec (@CreateViewStatement)
It gives me error:
'CREATE VIEW' must be the first statement in a query batch.
If I remove the USE DATABASE statement it works fine, but then the database is not specify anymore....
How can I solve this problem?
2 Answers 2
You can use nested EXEC
calls. The database context changed by the USE
persists to the child batch.
DECLARE @DB SYSNAME
SET @DB = 'tempdb'
DECLARE @CreateViewStatement NVARCHAR(MAX)
SET @CreateViewStatement = '
USE '+ QUOTENAME(@DB) +';
EXEC(''
CREATE VIEW [dbo].[MyTable] AS
SELECT 1 AS [Foo]
'')
'
EXEC (@CreateViewStatement)
-
1+1 - If you script out views using SMO this is how the framework does it as well - definitions are executed in dynamic SQL to get around the restrictionJNK– JNK2012年02月02日 16:44:12 +00:00Commented Feb 2, 2012 at 16:44
-
1@KingChan - you can both upvote and accept, FYI ;)JNK– JNK2012年02月02日 16:54:23 +00:00Commented Feb 2, 2012 at 16:54
-
@JNK +1 of course~ :)King Chan– King Chan2012年02月02日 17:42:37 +00:00Commented Feb 2, 2012 at 17:42
-
definitely worked!! although i used it, wih many variables inside the nested query so i was a headache becuz of the quote handling! great solution though !user20268– user202682013年02月18日 01:49:23 +00:00Commented Feb 18, 2013 at 1:49
-
You are a hero. Will name my firstborn child after you.Jens– Jens2017年05月03日 12:16:21 +00:00Commented May 3, 2017 at 12:16
One way I have handled when run into this case is placing GO after use statement.
set @CreateViewStatement =
'
USE ['+ @DB +']; GO
CREATE VIEW [dbo].[MyTable]
AS
SELECT ........something'
exec (@CreateViewStatement)
-
Just so you know, GO statment won't runs in execKing Chan– King Chan2012年02月02日 17:44:36 +00:00Commented Feb 2, 2012 at 17:44
-
2This won't work in the context of dynamic SQL.
GO
is a batch delimiter in the client tools not a TSQL keyword.Martin Smith– Martin Smith2012年02月02日 17:45:30 +00:00Commented Feb 2, 2012 at 17:45
Explore related questions
See similar questions with these tags.