Sql-Server

生成腳本 - ‘GO’ 附近的語法不正確

  • October 10, 2016

這是我的腳本的部分視圖,用於為特定索引生成放置索引

  ,[DropIndexScript] = 'DROP INDEX ' + QUOTENAME(SI.name) + 
  + CHAR(13) + ' ON '  + 
   QUOTENAME(Schema_name(T.Schema_id)) +'.'+ QUOTENAME(T.name) + CHAR(10) + CHAR(13) + 'GO' + CHAR(13)

FROM sys.indexes I  
INNER JOIN (
             SELECT  Object_id
                    ,Schema_id
                    ,NAME
                    FROM sys.tables 

             UNION ALL 

             SELECT  Object_id
                    ,Schema_id
                    ,NAME
                    FROM sys.views  

           ) T

          ON T.Object_id = I.Object_id   

INNER JOIN sys.sysindexes SI ON I.Object_id = SI.id AND I.index_id = SI.indid 

問題是:

當我使用這個時:

+ CHAR(10) + CHAR(13) + 'GO' + CHAR(13)

它有效 - 生成此腳本:

DROP INDEX [IDX_ProdImages_GetProductListingPageDenormalisedData]
ON [dbo].[ProductImages]

GO

當我不使用+ CHAR(10) + CHAR(13) +

在此處輸入圖像描述

消息 102,級別 15,狀態 1,第 38289 行“GO”附近的語法不正確。

還有其他方法可以完成這項工作嗎?

問題是您在換行符的變體中混淆了哪個字元:CRLF / LF。你有:

,[DropIndexScript] = 'DROP INDEX ' + QUOTENAME(SI.name) + 
  + CHAR(13) + ' ON '  + 
QUOTENAME(Schema_name(T.Schema_id)) +'.'+ QUOTENAME(T.name)
+ CHAR(10) + CHAR(13) + 'GO' + CHAR(13)

在這裡你使用CHAR(13)or CHAR(10) + CHAR(13)。問題是CHAR(13)“輸入”/“CR”CHAR(10)是“換行”/“LF”。您已將它們顛倒過來,因此在各個地方都使用了“CR”和“LFCR”。如果您將“10”換成“13”,它將正常工作。

更好的是它們之間的一致性。要麼在CHAR(10)任何地方使用,要麼在任何CHAR(13) + CHAR(10)地方使用。

引用自:https://dba.stackexchange.com/questions/151696