0

我正在使用 ScriptDom 来解析 SQL 脚本。我的程序如下

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 ONSET ANSI_NULLS ON,它仍然是一个有效的存储过程。

或者是否必须使用这些?有没有办法绕过它?

4

2 回答 2

1

Priyanka 的问题是在您的 CREATE PROCEDURE 文本之前有一个(不可见的)0xFFFE。如果您使用键盘,则可以验证这一点,转到 C 字符并将光标向左移动。你会发现在 C 的左边,光标似乎并没有向左前进,除非你再次按下左箭头键。

0xFFFE 是用于检测 Unicode 字节顺序的字节顺序标记,我怀疑这已以某种方式潜入您的代码中。现在,您可以使用 DEL 或 BackSpace 键简单地删除隐藏字符,它会修复它。

同样,将来总是将 true 传递给 TSql100Parser 类的构造函数。带引号的标识符处理默认是开启的,所以我们需要在解析器构造函数中尊重它。

于 2013-05-01T09:40:55.630 回答
0

阅读这两篇文章:
QUOT.ID:http://msdn.microsoft.com/en-us/library/ms188048.aspx ANSI:http : //msdn.microsoft.com/en-us/library/ms174393.aspx在您的情况,可能缺少后一种会导致问题,因为您的 UPDATE 获取 NULL(s)


于 2013-04-23T10:43:47.650 回答