更新临时表

时间:2013-01-02 21:46:57

标签: sql sql-server-2008 ssms

我正在为新的一年创建一些报告。我解除了这个代码并尝试使其适用于临时表,因为我没有在我的数据库上创建表权限。我注释掉了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     

2 个答案:

答案 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如果这是你问题的原因,但这是我注意到的第一件事

相关问题