试图在SQL Server中执行命令时出错(Error when trying to execute

2019-11-04 07:18发布

我使用SQL Server 2014上的测试数据库中创建的所有用户数据库视图工作。 从SSMS运行,但在执行命令尝试运行它,我收到以下错误消息时生成的SQL语句工作正常。

SQL查询:

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)

生成的查询:

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

错误信息:

 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'. 

Answer 1:

在这种情况下,我按照这个逻辑:

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;

首先有一个声明表变量。 您可以分别插入所有的语句。

没有GO

不论你想设置一个GO只需插入一个新的命令。

CURSOR将执行你插入的顺序所有语句。

在第一次尝试注释掉的EXEC和复制所有的PRINT -输出到一个新的查询窗口来检查语法错误。 然后一气呵成执行一大堆...



文章来源: Error when trying to execute a command in sql server