2016-08-25 6 views
0

я написал хранимую процедуру с динамическим SQL, который выдает ошибку, когда я называю его, когда аргументы:SQL Server: dymanic ошибка SQL: «CREATE VIEW» должен быть первым оператором в пакете запроса

IF OBJECT_ID('[dbo].[find_most_frequent]') IS NOT NULL 
    DROP PROCEDURE [dbo].[find_most_frequent] 
GO 

CREATE PROCEDURE [dbo].[find_most_frequent] 
     @table_in VARCHAR(100), 
     @table_out VARCHAR(100), 
     @col_group VARCHAR(100), 
     @col_2 VARCHAR(100) 
AS 
BEGIN 
    DECLARE @sql NVARCHAR(4000); 

    SET @sql = 
    --start of code 
    'USE CTR 
GO 

IF OBJECT_ID(N''[dbo].[two_columns]'', N''V'') IS NOT NULL 
    DROP VIEW [dbo].[two_columns]; 

IF OBJECT_ID(N''[dbo].[count_in_group]'', N''V'') IS NOT NULL 
    DROP VIEW [dbo].[count_in_group]; 

IF OBJECT_ID(N''[dbo].[rank_in_group]'', N''V'') IS NOT NULL 
    DROP VIEW [dbo].[rank_in_group]; 

IF OBJECT_ID(N''[dbo].[most_frequent_in_group]'', N''V'') IS NOT NULL 
    DROP VIEW [dbo].[most_frequent_in_group]; 
GO 

CREATE VIEW [dbo].[two_columns] AS 
SELECT ' + 
     @col_group + 
     ' ,' + @col_2 + 
    ' FROM ' + @table_in + 
' 
GO 

CREATE VIEW [dbo].[count_in_group] AS 
SELECT DISTINCT 
     * 
     ,COUNT(*) OVER(PARTITION BY ' + @col_group + ', ' + @col_2 + ') AS freq 
    FROM [dbo].[two_columns] 
GO 

CREATE VIEW [dbo].[rank_in_group] AS 
SELECT * 
     ,ROW_NUMBER() OVER (PARTITION BY ' + @col_group + ' ORDER BY freq DESC) AS rank_in_group 
    FROM [dbo].[count_in_group] 
GO 

CREATE VIEW [dbo].[most_frequent_in_group] AS 
SELECT * 
    FROM [dbo].[rank_in_group] 
    WHERE rank_in_group = 1 
GO 

SELECT * 
    INTO ' + @table_out + 
    ' FROM [dbo].[most_frequent_in_group] 
GO' 
--end of code  
    print @sql 
    EXEC SP_EXECUTESQL @sql 
END 
GO 

--call it 
EXEC [dbo].[find_most_frequent] 
     @table_in = '[dbo].[table_1]' 
     ,@table_out = '[dbo].[table_out]' 
     ,@col_group = '[col_A]' 
     ,@col_2 = '[col_B]' 
GO 

Ошибка :

Msg 102, Level 15, State 1, Line 81
Incorrect syntax near 'GO'.
Msg 102, Level 15, State 1, Line 91
Incorrect syntax near 'GO'.
Msg 111, Level 15, State 1, Line 93
'CREATE VIEW' must be the first statement in a query batch.
Msg 111, Level 15, State 1, Line 97
'CREATE VIEW' must be the first statement in a query batch.
Msg 111, Level 15, State 1, Line 104
'CREATE VIEW' must be the first statement in a query batch.
Msg 111, Level 15, State 1, Line 110
'CREATE VIEW' must be the first statement in a query batch.
Msg 102, Level 15, State 1, Line 114
Incorrect syntax near 'GO'.

номер строки бесполезен, так как они являются линии после окончания моего кода ...

в процедуре я напечатал @sql поглазеть. Я копирую печатный код и вставляю его в другой запрос, он работал. - Поэтому я полностью не знаю, как отладить его сейчас.

USE CTR 
GO 

IF OBJECT_ID(N'[dbo].[two_columns]', N'V') IS NOT NULL 
    DROP VIEW [dbo].[two_columns]; 

IF OBJECT_ID(N'[dbo].[count_in_group]', N'V') IS NOT NULL 
    DROP VIEW [dbo].[count_in_group]; 

IF OBJECT_ID(N'[dbo].[rank_in_group]', N'V') IS NOT NULL 
    DROP VIEW [dbo].[rank_in_group]; 

IF OBJECT_ID(N'[dbo].[most_frequent_in_group]', N'V') IS NOT NULL 
    DROP VIEW [dbo].[most_frequent_in_group]; 
GO 

CREATE VIEW [dbo].[two_columns] AS 
SELECT [hash_vcc] ,[legal_name] FROM [dbo].[ctr_vendor_pay] 
GO 

CREATE VIEW [dbo].[count_in_group] AS 
SELECT DISTINCT 
     * 
     ,COUNT(*) OVER(PARTITION BY [hash_vcc], [legal_name]) AS freq 
    FROM [dbo].[two_columns] 
GO 

CREATE VIEW [dbo].[rank_in_group] AS 
SELECT * 
     ,ROW_NUMBER() OVER (PARTITION BY [hash_vcc] ORDER BY freq DESC) AS rank_in_group 
    FROM [dbo].[count_in_group] 
GO 

CREATE VIEW [dbo].[most_frequent_in_group] AS 
SELECT * 
    FROM [dbo].[rank_in_group] 
    WHERE rank_in_group = 1 
GO 

SELECT * 
    INTO [dbo].[hashvcc_2_legalname] FROM [dbo].[most_frequent_in_group] 
GO 

Может ли кто-нибудь помочь, пожалуйста? Любая помощь оценивается. Благодаря

UPDATE:

Я разделил каждый CREATE VIEW в разные строки, и EXEC их по отдельности. - Используйте BEGINEND для обертывания каждого CREATE VIEW не работает.

Теперь еще этот кусок бросает ошибку:

CREATE VIEW [dbo].[most_frequent_in_group] AS 
SELECT * 
    FROM [dbo].[rank_in_group] 
    WHERE rank_in_group = 1 

SELECT * 
    INTO [dbo].[hashvcc_2_legalname] 
    FROM [dbo].[most_frequent_in_group] 

Ошибка:

Incorrect syntax near the keyword 'SELECT'.

Это работает, когда я бегу CREATE VIEW и SELECT отдельно.

Got Ответ: VIEW должен быть единственным оператором в партии - благодаря @ZLK

+0

К сожалению, поскольку «GO» на самом деле не является T-SQL (см. Примечания здесь: https://msdn.microsoft.com/en-us/library/ms188037.aspx), вам нужно будет рассмотреть альтернативу, например разбивая каждую часть и выполняя их отдельно. – ZLK

+0

Спасибо @ZLK! Работает ли BEGIN END? –

+0

В динамическом sql? Да ... Но не для создания просмотров и других таких вещей, которые должны быть в начале партии. – ZLK

ответ

1

О GO:

GO is not a Transact-SQL statement; it is a command recognized by the sqlcmd and osql utilities and SQL Server Management Studio Code editor.

Сплит запрос на отдельные запросы:

EXEC sp_executesql N' 
USE CTR 

IF OBJECT_ID(N''[dbo].[two_columns]'', N''V'') IS NOT NULL 
    DROP VIEW [dbo].[two_columns]; 
IF OBJECT_ID(N''[dbo].[count_in_group]'', N''V'') IS NOT NULL 
    DROP VIEW [dbo].[count_in_group]; 
IF OBJECT_ID(N''[dbo].[rank_in_group]'', N''V'') IS NOT NULL 
    DROP VIEW [dbo].[rank_in_group]; 
    IF OBJECT_ID(N''[dbo].[most_frequent_in_group]'', N''V'') IS NOT NULL 
    DROP VIEW [dbo].[most_frequent_in_group];' 

EXEC sp_executesql N' 
CREATE VIEW [dbo].[two_columns] AS 
SELECT [hash_vcc] ,[legal_name] FROM [dbo].[ctr_vendor_pay]' 

... 

И так далее.

+0

Вижу. Спасибо, @ Backs! Работает ли BEGIN END? Нужно ли N перед строкой? Спасибо - –

+0

@YZhang 'BEGIN' и' END' - действительный синтаксис TSQL. 'N' означает, что строка является unicode. Хранимая процедура 'sp_executesql' работает только с unicode – Backs

Смежные вопросы