web-dev-qa-db-ja.com

スクリプトの生成-'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) +を使用しない場合

enter image description here

メッセージ102、レベル15、状態1、行38289「GO」付近の構文が正しくありません。

これを行う他の方法はありますか?

1

問題は、改行のバリエーションでどの文字がどの文字であるかを混同していることです: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)を使用します。

1
Solomon Rutzky