DECLARE @script VARCHAR(MAX);
SET @script =
'
create table ali(id decimal(10,0));
drop table ali;
go
create table ali(id decimal(10,0));
drop table ali;
'
EXEC (@script);
执行上述查询时出现错误消息。请告诉我你是否有解决这个问题的想法。
Msg 102,Level 15,State 1,Line 4'go'附近的语法不正确。
注意:创建和删除创建表的上述代码仅作为示例, 我有一些其他动态查询与go语句。请不要给出这个答案。
DECLARE @script VARCHAR(MAX),
@script1 VARCHAR(MAX);
SET @script =
'
create table ali(id decimal(10,0));
drop table ali;
';
SET @script1 =
'
create table ali(id decimal(10,0));
drop table ali;
';
EXEC (@script);
EXEC (@script1);
答案 0 :(得分:20)
GO
实际上是not valid T-SQL:
GO不是Transact-SQL语句;这是一个被公认的命令 sqlcmd和osql实用程序以及SQL Server Management Studio代码 编辑器。
您必须在动态SQL中删除GO
的实例,或者使用文章中提到的工具之一(例如命令行中的osql
)。您的查询仍应适用于从动态SQL中删除的GO
的所有实例。
答案 1 :(得分:9)
我认为这里的每个人都挂了“GO”关键字。
解决方案:
--Your Script modified by adding a single line of code:
DECLARE @script nVarChar(MAX);--I changed from VarChar to nVarChar - you should always use nVarChar for Dynamic SQL.
SET @script =
'
create table ali(id decimal(10,0));
drop table ali;
go
create table ali(id decimal(10,0));
drop table ali;
'
--In case you have apostrophes in your script, you must escape them for the Exec() command. - 03/14/2013 - MCR.
SET @script = 'EXEC (''' + REPLACE(REPLACE(@script, '''', ''''''), 'GO', '''); EXEC(''') + ''');'--Just add this one line.
PRINT @script --See the command used (will be truncated in Select/Print, but not when Executing).
EXEC (@script);
对于那些寻找动态连接表中多个语句的解决方案的人:
--Example of compiling and chaining multiple DDL statments from data in a table:
-- DDL (Data Definition Language).
-- These are statements used to create, alter, or drop data structures.
-- They MUST be run in a single Batch.
-- The "GO" keyword is a SSMS syntax for splitting up batches - it is not an SQL keyword.
DECLARE @DDL_Statements TABLE
(
DDL nVarChar(MAX)
)
INSERT INTO @DDL_Statements (DDL)
SELECT 'create table ali(id decimal(10,0)); drop table ali;' UNION ALL
SELECT 'create table ali(id decimal(10,0)); drop table ali;'
DECLARE @SqlCommand nVarChar(MAX) = ''
SELECT @SqlCommand = @SqlCommand + 'EXEC(''' + REPLACE(DS.DDL, '''', '''''') + '''); '
FROM @DDL_Statements as DS --In case you have apostrophes in your script, you must escape them for the Exec() command. - 03/14/2013 - MCR.
PRINT @SqlCommand --See the command used (will be truncated in Select/Print, but not when Executing).
EXEC (@SqlCommand)
答案 2 :(得分:5)
您无法在动态T-SQL查询中使用GO
,如@mellamokb所述。
由于您不想运行单独的SQL查询,如问题的第二部分所述,您可能会自行分开查询分离查询。
你可以split the query on GO
using a UDF。拆分后,执行分离的批次。
但首先在其中创建一个包含GO
的字符串,然后片刻之后将其拆分,感觉并不自然。
答案 3 :(得分:3)
GO是一个批处理分隔符,正如其他人所指出的那样,它不是有效的SQL。事实上,您可以转到SSMS - 工具 - 选项 - 查询执行 - SQL Server并输入一些其他文本,例如COME用作批处理分隔符。
如果你这样做,即使在SSMS中也不会识别GO。即使没有批处理分隔符,您也应该运行动态SQL。我不认为这里需要GO
拉吉
答案 4 :(得分:1)
您希望在动态SQL中使用GO的示例 我需要用数据填充几个表,并希望使用GO n,其中n表示我希望它运行的时间。
DECLARE @statement TABLE
(
SqlCommand NVARCHAR(MAX)
)
DECLARE @sqlCommand NVARCHAR(MAX) = 'INSERT INTO [dbo].[tbl_table1] ([Field1],[Field2],[Field3],[Field4],[Field5],[Field6],[Field7],[Field8],[Field9],[Field10],[Field11])SELECT ''a'',''b'',''c'',''d'',''e'',''f'',''g'',''h'',''i'',''j'',RAND(),RAND(),RAND()
GO 10000'
INSERT INTO @statement
( SqlCommand )
VALUES ( @sqlCommand )
SET @sqlCommand = REPLACE(@sqlCommand, '[tbl_table1]', '[tbl_table2]')
INSERT INTO @statement
( SqlCommand )
VALUES ( @sqlCommand )
这段代码可以生成一个select语句表,我需要复制和运行而不是能够做到
EXEC(@sqlCommand)
在“10000”错误附近给出了错误的语法。