解决方案 »

  1.   

    试了用动态SQL,print出来的代码可以执行,但是用EXEC的还是报错,你的Identity还需要额外指定?什么应用情景?
      

  2.   

    回版主大人,我有一个分5段的分类编码(二进制:1111111 1111111 1111111 0000000 0000000 = 十进制34359721984),因为是分段的连续值,想要根据传过来的参数确定一个最小的缺失值,不知道我的思路对不对,类似这样:CREATE PROCEDURE [dbo].[mypcAddProCategory]
    (
    @PcPID bigint, 
    @PdName nvarchar(300),
    @A1 bigint, 
    @A2 bigint, 
    @BStep bigint
    )
    ASset nocount on
    begindeclare @newPCID bigint
    set @newPCID = 0declare @indextable table([id] [bigint] IDENTITY(@A1+1,@BStep) NOT NULL, [nid] [bigint] NULL)insert into @indextable(nid) SELECT PcID FROM ProCategory WHERE (PcID > @A1) AND (PcID <= @A2) AND (PcPID = @PcPID) ORDER BY PcIDSELECT TOP 1 @newPCID = t.id
    FROM @indextable t
    WHERE t.id <> t.nid
    ORDER BY t.idprint @newPCIDend
    set nocount off
      

  3.   

    之所以需要用动态的IDENTITY(@A1+1,@BStep),是因为每段的起始值和增值都不用,所以想用动态的实现
      

  4.   

    我也试了一下,这个表变量中的identity是不能设置 变量的
      

  5.   

    试试这个,只能把所有的语句,全部改成动态语句:CREATE PROCEDURE [dbo].[mypcAddProCategory]
    (
    @PcPID bigint, 
    @PdName nvarchar(300),
    @A1 bigint, 
    @A2 bigint, 
    @BStep bigint
    )
    ASset nocount on
    begindeclare @sql varchar(8000)declare @t table(newPCID bigint)set @sql = '
    declare @newPCID bigint
    set @newPCID = 0
                
    declare @indextable table([id] [bigint] IDENTITY('+CAST(@A1+1 as varchar)+','+CAST(@BStep as varchar)+'
    ) NOT NULL, [nid] [bigint] NULL)insert into @indextable(nid) SELECT PcID FROM ProCategory WHERE (PcID > 
    '+CAST(@A1 as varchar)+
    ') AND (PcID <= '+CAST(@A2 as varchar)+') AND (PcPID = '+CAST(@PcPID as varchar)+
    ') ORDER BY PcID SELECT TOP 1 t.id
    FROM @indextable t
    WHERE t.id <> t.nid
    ORDER BY t.id
    '--select @sqlinsert into @t
    exec(@sql)
    declare @newPCID BIGINTselect @newPCID = newPCID from @t
    print @newPCID
    end
    set nocount off
    go