在一个DECLARE块中定义T-SQL表和其他变量

6
以下内容无法编译:
  DECLARE
    @DateFrom Date = '20151225',
    @DateTo Date = '20151226',
    @Ids TABLE (Id Int NOT NULL);

出现错误:

关键字“TABLE”附近的语法不正确。

但是当我为表变量声明添加它自己的DECLARE时,它可以完美编译:

 DECLARE
    @DateFrom Date = '20151225',
    @DateTo Date = '20151226';

 DECLARE
    @Ids TABLE (Id Int NOT NULL);

这里是 SQL fiddle。

第一段代码有什么问题吗?我们不能在同一个 DECLARE 块中声明共享表变量和其他变量声明吗?

2个回答

10

来自DECLARE文档:

在声明表变量时,表变量必须是DECLARE语句中唯一被声明的变量。

你也可以从语法中清楚地看到:

DECLARE 
{ 
    { @local_variable [AS] data_type  | [ = value ] }
  | { @cursor_variable_name CURSOR }
} [,...n] 
| { @table_variable_name [AS] <table_type_definition> } 

可以声明一个或多个本地变量(使用 [,...n] 部分),也可以只声明一个表变量名为 @table_variable_name


出于好奇,您知道是什么让SQL Server在每个“DECLARE”块中只需要一个表变量声明吗?这是否与T-SQL语法限制有关?或者与SQL Server编译/执行/处理声明的方式有关? - Alexander Abakumov

3
如果你想让第一个片段工作,需要创建表类型。关于表类型的详细信息请参考此处
CREATE TYPE dbo.ids as TABLE(Id Int NOT NULL)

DECLARE
    @DateFrom Date = '20151225',
    @DateTo Date = '20151226',
    @Ids dbo.ids;

注意:如果您在FUNCTION/STORED PROCEDURE中将Table type作为输入参数使用,则需要将其声明为READONLY


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接