1

我有需要的ID扰频器,所以很多表:如何将现有的表格传递给过程?我如何使用这个...表值参数thingys?看看下面请我的代码

CREATE PROCEDURE SP_generateUniqueID (-- pass table here somehow --) 
AS 
BEGIN 
    DECLARE @ID   varchar(100) -- NEW ID. 
    DECLARE @isIDInUse tinyint   -- BOOLEAN YES/NO. 
    SET  @isIDInUse=1 
    WHILE(@isIDInUse=1)     -- KEEP GENERATING TILL YOU FIND ONE: 
     BEGIN 
      SET @ID= dbo.generateID('aA1a1') -- GENERATES ID. doesn't matter how. 
      IF (@ID NOT IN (@passedTable)) -- DOES @ID EXIST ALREADY? 
     /*(SEARCHES THE PASSED TABLE! Which its size will be 1XN)*/ 
       SET @isIDInUse=0    -- NO, YOU CAN USE. 
     END 
    RETURN @ID 
END 

我不能让现有的表的传递顺利...... 我希望能够插入任何使用ID的表。 有什么建议吗?

+5

有几个选项(CLR ,动态SQL)。但如果你解释目的,这可能会有所帮助。在附加的背景下,您更有可能获得正确的解决方案。 –

+0

你检查过表值参数吗? –

+0

表值参数是一个死胡同 - 你不能只传递一个表,你只能传递一个表变量。 – Luaan

回答

0

我会建议你真的是看起来很难成为这个问题的更好的解决方案。您将在您生成的新ID的每次迭代时触击您的表/索引。什么是错的自动递增的整数值:

create table IDs (ID int identity(1,1))

(也,SQL Server为布尔值bit数据类型无需您tinyint


这且不说,在只有这样,我认为你可以这样做你的方式是动态SQL。使用下面你的脚本应该能够看到你怎么能在你的schema.table传递给存储过程,并在过程中定义ID在该检查回路中插入:

create table a(ID nvarchar(100)) insert into a values('1'),('2'),('3'),('4'),('5') 
create table b(ID nvarchar(100)) insert into b values('6'),('7'),('8'),('9'),('10') 


declare @Table nvarchar(100) = 'dbo.a' 

declare @ID nvarchar(100) = '6' 
declare @IDinUse bit = 0 

declare @sql nvarchar(max) = 'if exists(select ID from ' + @Table + ' where ID = @ID) select @IDinUse = 1 else select @IDinUse = 0' 
exec sp_executesql @sql, N'@ID nvarchar(100), @IDinUse bit output', @ID = @ID, @IDinUse = @IDinUse output 
select @IDinUse as IDinUse 

go 

declare @Table nvarchar(100) = 'dbo.b' 

declare @ID nvarchar(100) = '6' 
declare @IDinUse bit = 0 

declare @sql nvarchar(max) = 'if exists(select ID from ' + @Table + ' where ID = @ID) select @IDinUse = 1 else select @IDinUse = 0' 
exec sp_executesql @sql, N'@ID nvarchar(100), @IDinUse bit output', @ID = @ID, @IDinUse = @IDinUse output 
select @IDinUse as IDinUse 
相关问题