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 
相關問題