2012-08-08 97 views
2

此例給出了例外:'NVARCHAR'不是公認的內置函數名稱。NVARCHAR的奇怪例外

DECLARE @BatchIds TABLE 
    (
     BatchId AS UNIQUEIDENTIFIER , 
     UserLogonId AS NVARCHAR(80) , 
     ReportStatus NVARCHAR(100) , 
     Created DATETIME , 
     RunTimeInMins AS INT , 
     ReportName NVARCHAR(200) 
    ) 

當我刪除了 「AS」 爲NVARCHAR,它不給任何異常。

DECLARE @BatchIds TABLE 
    (
     BatchId AS UNIQUEIDENTIFIER , 
     UserLogonId NVARCHAR(80) , 
     ReportStatus NVARCHAR(100) , 
     Created DATETIME , 
     RunTimeInMins AS INT , 
     ReportName NVARCHAR(200) 
    ) 

對此有何建議?

更新:

請注意,我的問題是更針對AS爲什麼在幕後這種情況不是試圖解決一個工作環境的工作不同。 對於那些無法獲得第二個樣品的人,請嘗試此操作。 這給了我,我插不出錯相同的數據和SQL Server版本 的Microsoft SQL Server 2008 R2(RTM) - 10.50.1600.1(X64)....

DECLARE @BatchIds TABLE 
    (
     UserLogonId NVARCHAR(80) , 
     ReportStatus NVARCHAR(100) , 
     Created DATETIME 
    ) 
INSERT INTO @BatchIds 
     (UserLogonId , 
      ReportStatus , 
      Created 
     ) 
VALUES ('Test1' , 
      'Test2' , 
      '2012-08-08' 
     ) 

SELECT * 
FROM @BatchIds 
SELECT @@VERSION AS [Version] 

把一個AS中此查詢爲NVARCHAR引發與上面相同的異常。

UPDATE:

這是解決。這種行爲只有當你編譯它時,SQL Server才允許你編譯它。但是當你運行它時,它會爲使用AS的任何數據類型引發異常。

+1

即使是第二個也應該給出例外。數據類型不能使用別名 – praveen 2012-08-08 15:28:26

+0

@praveen:The第二個人雖然沒有給出任何例外。 – Kash 2012-08-08 15:33:21

+0

這很奇怪你使用的是哪個sql版本?它應該失敗,因爲別名用於指定列名稱 – praveen 2012-08-08 15:38:33

回答

3

你並不需要所有這些AS關鍵字,你有 - 只是這樣定義你的表變量:

DECLARE @BatchIds TABLE 
(
    BatchId UNIQUEIDENTIFIER , 
    UserLogonId NVARCHAR(80) , 
    ReportStatus NVARCHAR(100) , 
    Created DATETIME , 
    RunTimeInMins INT , 
    ReportName NVARCHAR(200) 
) 

當嘗試我的SQL Server 2008 R2(SP1上運行您的樣品#2 - 開發人員版),我得到這些錯誤:

消息207,級別16,狀態1,行3
無效列名 '唯一標識符'。

消息207,級別16,狀態1,行7
無效列名 'INT'。

我必須刪除AS關鍵字才能使其工作。使用AS試圖爲該列定義一個別名 - 但由於UNIQUEIDENTIFIERINT是SQL Server中的保留關鍵字,因此不能將它們用作列別名。 SQL Server 2012 Express也一樣 - 我也得到這些錯誤,除非我刪除那些不必要的關鍵字,否則它們不能工作。AS關鍵字

+0

我明白了。我很好奇在SQL Server允許某些數據類型被允許使用AS而其他人不被允許的情況下發生的情況。 – Kash 2012-08-08 15:34:16

+2

@Kash:不需要那些'as'關鍵字 - 只是不要使用它們。 「AS」通常定義一個**別名**,例如,查詢中的表或列。在表變量的聲明中使用'AS'完全沒有意義。你的示例#2在我的機器上甚至都不起作用(SQL Server 2008 R2)並且出現錯誤 - 那些'AS'不允許用於某些類型,或者不適用於其他類型 - 它們只是簡單的不需要而且不是有效的。 – 2012-08-08 15:34:58