将 temptable 中的列作为参数传递给存储过程?

pass a column in a temptable to a stored procedure as a parameter?

我有一个存储过程,通常每次每个参数只取一个值。

USE [BannerLink] 
GO 

DECLARE @return_value int 
EXEC    @return_value = [dbo [BannerSummaryReportNoTag]
                        @BannerID = 31606,
                        @TagName = 'SOSEnglishIBVNoCover'

现在我有一个带有多个 BannerID 和 Tagname 的 temptable。我想知道是否有办法用来自 temptable 的数据填充存储过程。所以伪代码是这样的

USE [BannerLink] 
GO 

DECLARE @return_value int 
EXEC    @return_value = [dbo].[BannerSummaryReportNoTag]
                        @BannerID = #tmptable1.BannerID,
                        @TagName = #tmptable1.TagName

上面的代码显然不起作用,但我想知道如何在 SQL Server 中做到这一点。谢谢!

您可以使用 Table Type 来完成。创建类型:

CREATE TYPE MyTableType AS TABLE 
( TagName VARCHAR(50)
, BannerID INT );

改变你的过程:

ALTER PROCEDURE [dbo].[BannerSummaryReportNoTag]
@Banners MyTableType READONLY
AS
....

称呼它:

DECLARE @T MyTableType
INSER INTO t VALUES ...

EXEC [dbo].[BannerSummaryReportNoTag] @Banners = @t

最好的解决方案是使用 Table 类型参数,或者你需要一个性能杀手游标,像这样...

USE [BannerLink] 
GO 

DECLARE @return_value INT
       ,@BannerID     INT
       ,@TagName      VARCHAR(1000)


DECLARE cur CURSOR LOCAL FORWARD_ONLY FOR  
SELECT BannerID , TagName
FROM   #tmptable1

OPEN cur   
FETCH NEXT FROM cur INTO @BannerID, @TagName


WHILE @@FETCH_STATUS = 0   
BEGIN   
EXEC  @return_value = [dbo].[BannerSummaryReportNoTag]
                      @BannerID = @BannerID
                     ,@TagName  = @TagName

       FETCH NEXT FROM cur INTO @BannerID, @TagName  
END   

CLOSE cur   
DEALLOCATE cur