SQL スクリプトの解析に ScriptDom を使用しています。私のプログラムは以下の通りです
static void Main(string[] args)
{
string script = @"
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
CREATE PROCEDURE dbo.ws_Device_Update
(
@ApplicationId uniqueidentifier ,
@OriginalApplicationId uniqueidentifier ,
@DeviceIMEI nvarchar (50) ,
@OriginalDeviceIMEI nvarchar (50) ,
@ModelId int ,
@DeviceName nvarchar (50) ,
@DeviceDescription nvarchar (255) ,
@DeviceState int ,
@IsExpired bit ,
@IsSuspended bit ,
@LastAccessed datetime ,
@ClientSeqNo bigint ,
@ServerSeqNo bigint ,
@ModelCode varchar (50) ,
@PushToken varchar (512) ,
@PushLastAlive datetime ,
@PushLastDead datetime ,
@DeviceType int
)
AS
UPDATE dbo.[ws_Device]
SET
[ModelId] = @ModelId --Does a device model change with same DeviceIMEI .I doubt it
,[DeviceName] = @DeviceName --Does a device name change with same DeviceIMEI .I doubt it
,[DeviceDescription] = @DeviceDescription --Does a device description change with same DeviceIMEI .I doubt it
,[DeviceState] = @DeviceState
,[IsExpired] = @IsExpired
,[IsSuspended] = @IsSuspended
,[LastAccessed] = @LastAccessed
,[ClientSeqNo] = @ClientSeqNo
,[ServerSeqNo] = @ServerSeqNo
,[ModelCode] = @ModelCode --Does a device model code with same DeviceIMEI .I doubt it
,[PushToken] = @PushToken
,[PushLastAlive] = @PushLastAlive
,[PushLastDead] = @PushLastDead
,[DeviceType] = @DeviceType --Does a device device type change with same DeviceIMEI .I doubt it
WHERE
[ApplicationId] = @OriginalApplicationId
AND [DeviceIMEI] = @OriginalDeviceIMEI
";
IList<ParseError> parseErrors;
TSql100Parser tsqlParser = new TSql100Parser(false);
TSqlFragment fragment;
using (StringReader stringReader = new StringReader(script))
{
fragment = (TSqlFragment)tsqlParser.Parse(stringReader, out parseErrors);
}
if (parseErrors.Count > 0)
{
Console.WriteLine(@"Errors encountered: ""{0}""", parseErrors[0].Message);
}
Console.ReadKey();
}
正常に動作します。
しかし、私が言及しなければ
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
失敗する
発生したエラー: 「CREATE 付近の構文が正しくありません。」
私の質問は、なぜそれが起こっているのかです.... SET QUOTED_IDENTIFIER ON OR SET ANSI_NULLS ONがなくても、それはまだ有効なストアドプロシージャです。
またはそれらを使用することは必須ですか?それをバイパスする方法はありますか?