0

我正在为新年创建一些报告。我解除了此代码并尝试使其适用于临时表,因为我没有在我的数据库上创建表的权限。我注释掉了 PKey 部分,因为我认为我在临时表中不需要它。

我可以在 2099 年之前插入日期,在 BankHoliday 中插入“N”,HolidayName在临时表的列中插入“Null”。但是,当我单独或作为一个长查询运行“元旦”假期的更新部分时,我得到了相同的语法错误。“''附近的语法不正确。” 就在我觉得我也知道自己在做什么的时候...

Declare @FirstDate as Date
Declare @LastDate as Date
Declare @WorkingDate as Date

set @FirstDate = '01-01-2010'
SET @LastDate = '12-31-2099'

-- create holiday table replace # with dbo for permanent table
begin
create table #CACFederalReserverHolidays
(
[Date] Date Not Null,
BankHoliday nvarchar(1) Null,
HolidayName nvarchar(50) Null,
) ON [Primary]
end

----add primary key replace # with dbo for permanent table

--begin
--alter table #CACFederalReserverHolidays add constraint
--PK_CACFederalReserverHolidays Primary Key Clustered
--(
--Date
--)
--With (Statistics_NoRecompute = off,
--  Ignore_Dup_Key = Off,
--  Allow_Row_Locks = On,
--  Allow_Page_Locks = On) On [Primary]
--end

-- insert the first date

Insert into #CACFederalReserverHolidays 
([Date],[BankHoliday])
Values
(@FirstDate,'N')

-- insert the remaining dates by adding 1 to the last date
While (select MAX(DATE)
from #CACFederalReserverHolidays
) < @LastDate

begin
Set @WorkingDate =  DATEADD (day,1,(select MAX(DATE) from #CACFederalReserverHolidays))
if @WorkingDate <= @LastDate
    begin
        insert into #CACFederalReserverHolidays
        ([Date], [BankHoliday])
        Values
        (@WorkingDate, 'N')
            end
    else
        break
end

--ID Fed Holidays
begin
update #CACFederalReserverHolidays
 set BankHoliday = 'Y', 
    HolidayName = 'New Year''s Day'
    where DATEPART(day,Date) = 1
    and DATEPART(month,Date) = 1
    and DATEPART(Dw,Date) between 2 and 6
    
update #CACFederalReserverHolidays
     set BankHoliday = 'Y', 
    HolidayName = 'New Year''s Day'
    where DATEPART(day,Date) = 1
    and DATEPART(month,Date) = 1
    and DATEPART(Dw,Date) = 2
end

begin 
-- MLK Day, 3rd Mon in January
update #CACFederalReserverHolidays
 set BankHoliday = 'Y', 
    HolidayName = 'Martin Luther King Day'
    where DATEPART(day,Date) between 15 and 21
    and DATEPART(month,Date) = 1
    and DATEPART(Dw,Date) = 2
end     
4

2 回答 2

2

我认为您可能在 SQL Server(或 Management Studio)中发现了一个实际错误。

这两个 UPDATE 语句:

update #CACFederalReserverHolidays
 set BankHoliday = 'Y', 
    HolidayName = 'New Year''s Day'
    where DATEPART(day,Date) = 1
    and DATEPART(month,Date) = 1
    and DATEPART(Dw,Date) between 2 and 6
    
update #CACFederalReserverHolidays
     set BankHoliday = 'Y', 
    HolidayName = 'New Year''s Day'
    where DATEPART(day,Date) = 1
    and DATEPART(month,Date) = 1
    and DATEPART(Dw,Date) = 2

前两行中似乎有某种无效的空格字符和/或换行符。但是,当我一次扫描一个字符时,我找不到任何应该导致这种情况的 Unicode 值。尽管如此,当我编辑掉所有空格和换行符然后手动重新输入它们时,查询不再出现“无效语法”错误。

我建议你做同样的事情。但首先,我会要求您复制这些行并将它们带到 Microsoft Connect 并将它们作为可能的错误输入。

(实际上,如果您愿意,我很乐意将其输入 MS Connect。)


我已在此处将其作为 SQL Server 错误输入 Microsoft Connect:https ://connect.microsoft.com/SQLServer/feedback/details/775641/ssms-throws-spurious-incorrect-syntax-error 。随意去那里投票或评论它和/或表明你是否可以自己复制它。


我刚刚想通了。这是我为 Connect 修改后的帖子,它很好地解释了它:

当我在 SSMS 中逐字执行以下文本时:

update #CACFederalReserverHolidays
 set BankHoliday = 0

它抛出错误“''附近的语法不正确”。据我所知,它应该只是说#temp 表是未定义的。注意:即使定义了#temp 表,它也会引发相同的错误。

我从支持论坛上的用户问题中得到了这个(这里: 更新临时表)。将用户的文本剪切并粘贴到我的 SSMS 中,我能够将其缩小到这两行。经过大量的编辑和测试,我发现只有删除第一行和第二行之间的换行符和空格,然后自己重​​新输入,问题才会消失。怀疑一些不可见/无效的字符,然后我引用了文本并逐个字符地检查它:

select unicode(substring('update #CACFederalReserverHolidays
 set BankHolidayX = 0', 35,1))

但是查看字符 35、36 和 37,只显示了 Unicode 值 13、10 和 63(CR、LF 和空格)。

据我所知,这一定是一个错误,无论是在 Management Studio 中,还是在 SQL Server Parser 本身中。

请注意,到目前为止,我只在 SQL Server 2012 上复制了这个,但原始用户从 SQL Server 2008 报告了它。


好的,我刚刚意识到我上面的检查程序有缺陷,因为我在查看 Unicode 值之前将其转换为 ASCII。当我使用正确的表达式时:

select unicode(substring(N'update #CACFederalReserverHolidays
 set BankHolidayX = 0', 37,1))

它显示字符 37 实际上是 Unicode 值 8200。我对此不熟悉,但我认为它是无效的。


长话短说,似乎SQL代码中的一些空格(特别是后面的set ..行前的空格update..不是真正的空格(Unicode 63),但实际上是Unicode字符8200(“PUNCTUATION SPACE”,U+ 2008). 显然你需要用空格替换这些。

于 2013-01-02T22:09:05.580 回答
0

begin之后是什么--ID Fed Holidays

那些在那里没有意义。while它们只对开始和结束循环有意义。

IDK,如果这是您的问题的原因,但这是我注意到的第一件事

于 2013-01-02T21:51:22.483 回答