NVARCHAR 的奇怪异常

Kas*_*ash 2 sql-server nvarchar

这给出了一个例外:'NVARCHAR' 不是公认的内置函数名称。

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

当我删除 NVARCHAR 的“AS”时,它不会给出任何异常。

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

关于为什么的任何建议?

更新:

请注意,我的问题更多地是针对为什么 AS 在这种情况下在幕后的工作方式不同,而不是试图解决工作情况。对于那些无法使第二个示例工作的人,请尝试此操作。这为我提供了与Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64)相同的数据和 SQL Server 版本。

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]
Run Code Online (Sandbox Code Playgroud)

在此查询中为 NVARCHAR 放置一个 AS 会引发与上述相同的异常。

更新:

这已解决。只有当您编译它并且 SQL Server 允许您编译它时才会出现这种行为。但是当你运行它时,它会为使用 AS 的任何数据类型抛出异常。

mar*_*c_s 5

您不需要拥有的所有AS关键字 - 只需像这样定义您的表变量:

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

尝试在我的 SQL Server 2008 R2(SP1 - 开发人员版)上运行示例 #2 时,出现以下错误:

消息 207,级别 16,状态 1,第 3 行
无效的列名称“UNIQUEIDENTIFIER”。

消息 207,级别 16,状态 1,第 7 行
无效的列名称“INT”。

我必须删除AS关键字才能使其工作。UsingAS正在尝试为列定义别名- 但由于UNIQUEIDENTIFIERorINT是 SQL Server 中的保留关键字,您不能将它们用作列别名。SQL Server 2012 Express 也一样——我也遇到了这些错误,除非我删除那些不必要的AS关键字,否则无法让它工作

  • @Kash:不需要那些 `as` 关键字 - 只是不要使用它们。`AS` 通常定义一个**别名**,例如用于查询中的表或列。在表变量的声明中使用“AS”绝对没有意义。您的示例 #2 甚至无法在我的机器上运行(SQL Server 2008 R2)并给出错误 - 某些类型不允许使用这些 `AS` 或其他类型不允许使用 - 它们只是简单的不需要且无效. (2认同)