如何将现有的 table 传递给过程?我如何使用这个... table-valued parameters thingys?请看下面我的代码

How do I pass an existing table to a procedure? How do I use this... table-valued parameters thingys? look at my code below please

我有很多 table 需要 ID 加密器,所以:

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

我无法让现有的table顺利通过... 我希望能够插入任何使用 ID 的 table。 有什么建议吗?

我建议您 真的 努力寻找更好的解决方案来解决这个问题。您将在生成的新 ID 的每次迭代中点击 table/index。自动递增整数值有什么问题:

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

(另外,SQL 服务器有 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