Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
251 views
in Technique[技术] by (71.8m points)

tsql - Error when trying to execute a command in sql server

I am using SQL Server 2014 and working on creating views from all the user database on to a Test database. The generated sql statement works fine when run from SSMS but when the execute command tries to run it I get the following error message.

SQL Query:

DECLARE @SQL NVARCHAR(MAX),
        @QueryStmt NVARCHAR(MAX)

    SET @SQL = ''

 SELECT @SQL = @SQL + CHAR(13) + 'USE ' + QUOTENAME([name]) + ';
        SELECT @QueryStmt = ''USE TestDWH ''+ CHAR(13) + CHAR(10) + ''GO'' + CHAR(13) + CHAR(10) + ''IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(''''TestDWH.'' + s.name + ''.'' + o.name + '''''')  AND TYPE IN (''''V'''')) DROP VIEW '' + s.name + ''.'' + o.name +  CHAR(13) + CHAR(10) + ''GO'' + CHAR(13) + CHAR(10) + m.[definition] + CHAR(13) + CHAR(10) + ''GO'' 
        FROM sys.objects o JOIN sys.sql_modules m ON m.object_id = o.object_id AND o.[type] = ''V'' JOIN sys.schemas s ON s.schema_id = o.schema_id'
        FROM sys.databases 
  WHERE [database_id] > 4 

EXECUTE sp_executesql @SQL, N'@QueryStmt NVARCHAR(MAX) OUT', @QueryStmt OUT
EXECUTE(@QueryStmt)

Generated Query:

USE TestDWH
GO
IF OBJECT_ID('TestDWH.dbo.Test_vw_View1') IS NOT NULL DROP VIEW dbo.Test_vw_View1
GO

CREATE VIEW dbo.Test_vw_View1
AS

SELECT [Id]
      ,[Description]
  FROM [dbo].[Test_Table1]

GO

Error Message:

Msg 102, Level 15, State 1, Line 2
Incorrect syntax near 'GO'.
Msg 102, Level 15, State 1, Line 4
Incorrect syntax near 'GO'.
Msg 111, Level 15, State 1, Line 5
'CREATE VIEW' must be the first statement in a query batch.
Msg 102, Level 15, State 1, Line 84
Incorrect syntax near 'GO'.
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

In such cases I follow this logic:

DECLARE @cmdTbl TABLE(id INT IDENTITY,cmd NVARCHAR(MAX));

INSERT INTO @cmdTbl(cmd) VALUES(N'SELECT TOP 3 * FROM INFORMATION_SCHEMA.TABLES');
INSERT INTO @cmdTbl(cmd) VALUES(N'SELECT TOP 3 * FROM INFORMATION_SCHEMA.COLUMNS');

DECLARE @cmd VARCHAR(MAX);
DECLARE cur CURSOR FOR SELECT cmd FROM @cmdTbl ORDER BY id;
OPEN cur;

FETCH NEXT FROM cur INTO @cmd;
WHILE @@FETCH_STATUS = 0
BEGIN
    PRINT @cmd;
    EXEC(@cmd);
    FETCH NEXT FROM cur INTO @cmd;
END
CLOSE cur;
DEALLOCATE cur;

First there is a declared table variable. You insert all your statements separately.

No GO!

Everywhere you want to set a GO just insert a new command.

The CURSOR will execute all statements in the order you inserted them.

In the first attempt comment-out the EXEC and copy all the PRINT-output into a new query window to check for syntax errors. Then execute the whole lot in one go...


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...