これは、特定のインデックスのドロップインデックスを生成するためのスクリプトの部分的なビューです
_ ,[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)
またはCHAR(10) + CHAR(13)
を使用します。問題は、CHAR(13)
が「改行」/「CR」であるのに対し、CHAR(10)
は「改行」/「CR」であるということです。あなたはそれらを逆にしたので、様々な場所で「CR」と「LFCR」の両方を使用しています。 「10」を「13」に交換すると、正しく機能します。
さらに良いのは、それらの間で一貫性を持たせることです。すべての場所でCHAR(10)
だけを使用するか、すべての場所でCHAR(13) + CHAR(10)
を使用します。