SQL Server : dymanic SQL error: 'CREATE VIEW' must be the first statement in a query batch
SQL Server : dymanic SQL error: 'CREATE VIEW' must be the first statement in a query batch
我用动态 SQL 编写了一个存储过程,当我调用它时会抛出一个错误参数:
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
有人可以帮忙吗?任何帮助表示赞赏。谢谢
更新:
我把每个CREATE VIEW
拆分成不同的字符串,分别执行。
- 使用 BEGIN
END
来包装每个 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
分开时有效。
得到答案:VIEW
必须是批处理中的唯一语句 - 感谢@ZLK
关于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]'
...
以此类推
我用动态 SQL 编写了一个存储过程,当我调用它时会抛出一个错误参数:
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
有人可以帮忙吗?任何帮助表示赞赏。谢谢
更新:
我把每个CREATE VIEW
拆分成不同的字符串,分别执行。
- 使用 BEGIN
END
来包装每个 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
分开时有效。
得到答案:VIEW
必须是批处理中的唯一语句 - 感谢@ZLK
关于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]'
...
以此类推