Sql-Server
生成腳本 - ‘GO’ 附近的語法不正確
這是我的腳本的部分視圖,用於為特定索引生成放置索引
,[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)
orCHAR(10) + CHAR(13)
。問題是CHAR(13)
“輸入”/“CR”CHAR(10)
是“換行”/“LF”。您已將它們顛倒過來,因此在各個地方都使用了“CR”和“LFCR”。如果您將“10”換成“13”,它將正常工作。更好的是它們之間的一致性。要麼在
CHAR(10)
任何地方使用,要麼在任何CHAR(13) + CHAR(10)
地方使用。