我正在为新的一年创建一些报告。我解除了这个代码并尝试使其适用于临时表,因为我没有在我的数据库上创建表权限。我注释掉了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
答案 0 :(得分: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值。尽管如此,当我编辑出所有空格和换行符然后手动重新输入它们时,查询将不再获得&#34;无效语法&#34;错误。
我建议你做同样的事情。但首先,我会请求您复制这些行并将它们带到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
它会在&#39;附近抛出错误&#34;语法不正确&#39;&#34;据我所知 它应该只是说#temp表是未定义的。注意:即使 #temp表已定义,它会抛出相同的错误。
我是在支持论坛上的用户问题中得到的(这里: Update A Temp Table)。 将用户的文本剪切并粘贴到我的SSMS中,我能够缩小范围 它归结为这两行。经过大量的编辑和测试,我 发现如果我删除了换行符,问题就会消失 和第一行和第二行之间的空格,然后重新输入它们 我。怀疑某些看不见/无效的字符,然后引用 文本并逐字逐句地检查:
select unicode(substring('update #CACFederalReserverHolidays set BankHolidayX = 0', 35,1))
但是看看角色35,36和37,只显示了Unicode 值13,10和63(CR,LF和空格)。
据我所知,这一定是一个bug,无论是在Management Studio中, 或者在SQL Server Parser中。
请注意,到目前为止,我只在SQL Server 2012上重现了这一点,但是 原始用户从SQL Server 2008报告了它。
好的,我刚刚意识到我的检查程序是 有缺陷,因为我在查看之前将其转换为ASCII Unicode值。当我使用正确的表达式时:
select unicode(substring(N'update #CACFederalReserverHolidays set BankHolidayX = 0', 37,1))
它揭示了字符37实际上是Unicode值8200.我是 不熟悉这个,但我认为它是无效的。
长话短说,似乎SQL代码中的一些空格(特别是set ..
之后的update..
行前面的空格不是真正的空格(Unicode 63),但是实际上是Unicode字符8200(&#34; PUNCTUATION SPACE&#34;,U + 2008)。显然,您需要用空格替换它们。
答案 1 :(得分:0)
begin
之后的--ID Fed Holidays
是什么?
那些没有意义。它们只对开始和结束while
循环有意义。
IDK如果这是你问题的原因,但这是我注意到的第一件事