如何将现有的 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
我有很多 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