1

我正在使用它,但我不知道为什么它不起作用。除了语法不正确之外,SSMS 不会给我有用的消息:

DECLARE @columnSeed DECIMAL
SELECT  @columnSeed = MAX([seeded_column]) + 1 FROM [table] (nolock) WHERE [conditions]
DECLARE @Temp_Table TABLE ([seeded_column] varchar(35) IDENTITY(@columnSeed, 1), [more columns])

我想从一个表中的列中获取最大值,并创建一个临时表变量,其中的标识列以之前的最大值为种子。

编辑:好的,在深入了解动态 SQL 之后,我想我已经有了应该工作的东西,但它仍然不是:

DECLARE @columnSeed DECIMAL
[@columnSeed set properly]
EXECUTE sp_executesql 
      N'DECLARE @Temp TABLE (seeded_column decimal IDENTITY(@seed, 1) NOT NULL [more columns])',
      N'@seed decimal',
      @seed = @columnSeed;

我现在得到的所有信息是我在“@seed”附近的语法不正确

4

2 回答 2

1

您不能将变量用作种子。这是无效的语法。在批处理执行之前已经隐式创建了表变量,并且无论如何都分配了变量。

这样做的唯一方法是连接所需的查询并执行它。表变量的所有用法都需要在子范围内。

DECLARE @columnSeed DECIMAL(18,0) = 10

DECLARE @sql NVARCHAR(MAX) = N'DECLARE @Temp TABLE (seeded_column decimal IDENTITY(' + CAST(@columnSeed AS NVARCHAR(19)) +', 1) NOT NULL)
        INSERT INTO @Temp DEFAULT VALUES;
        SELECT * FROM @Temp;'

EXECUTE sp_executesql 
      @sql,
      N'@seed decimal',
      @seed = @columnSeed;

我相信无论如何都有更好的方法来做你正在做的任何事情。

例如,您可以使用种子在外部范围内声明表变量,0并将所需的偏移量添加到您的SELECT查询中。

DECLARE @columnSeed DECIMAL(18,0) = 10

DECLARE @Temp TABLE (seeded_column decimal(18,0) IDENTITY(0, 1) NOT NULL)

INSERT INTO @Temp DEFAULT VALUES;
INSERT INTO @Temp DEFAULT VALUES;

SELECT @columnSeed + seeded_column AS psuedo_seeded_column 
FROM @Temp;

尽管对此的全部需求似乎是可疑的。您通常不应该关心IDENTITY值是什么。如果这是为了准备稍后插入到您正在计算的表中的数据,则@columnSeed可能只是插入它并使用该OUTPUT子句来获取ID插入的值可能更合适,并且并发问题的风险更小。

于 2013-07-22T20:51:49.213 回答
0

我认为你不能在 DDL 中使用参数。换句话说,您将无法@seedIDENTITY子句中使用。将种子转换为字符串并手动将其推送到您的 DDL 中。像这样的东西应该工作。(我手边没有 SQL Server 实例,如果有任何其他错误,我深表歉意。关键是:不要在 DDL 语句中使用参数。)

DECLARE @columnSeed DECIMAL
DECLARE @sql NVARCHAR(1024)

[@columnSeed set properly]

SET @sql = N'DECLARE @Temp TABLE (seeded_column decimal IDENTITY(' || CONVERT(NVARCHAR, @seed) || N', 1) NOT NULL [more  columns])';

EXECUTE sp_executesql @sql
于 2013-07-22T20:49:43.903 回答