0

我需要提供一个解决方案,通过多种参数在SQL Server中的一系列报告存储过程的问题,2008年的参数将是用户偏好和可以由其中用户已选择多于一个类型的列表价值(例如多个月)。可能有多达30个不同的参数,其中60%会包含多个选项。将偏好类型参数传递给存储过程 - 最佳实践?

到目前为止,我有3个选项。

  1. 传中值与一组接口正常参数 - 这似乎是相当快的,我需要通过集合(多个月份会是一个很好的例子)失败。

  2. 通行证中的参数为单个XML片段。尽管我不确定它是否可以处理相同类型的多个元素(例如上面的几个月),但此方法已在此处使用。该代码使用DynaFilter来解析XML - 我从来没有听说过它,并且在互联网上找不到任何参考。编写代码的开发人员明天会回来,所以我会有更多信息。

  3. 使用表值参数 - 我才刚刚开始看这些,但他们看好,似乎提供了良好的性能。

我们使用SQL Server 2008和ASP.Net MVC前端。如有需要,我们可以移至2012年。

我已经开始,并会继续做更多的研究来解决这个问题的最好办法,但都重视的最佳方式任何意见前,如果有任何可用的其他选项。

在此先感谢。

+1

看看这里的答案 - 它同样适用于大量的参数。我建议使用表值参数,我已经使用它们,它们非常快。 http://stackoverflow.com/questions/43249/t-sql-stored-procedure-that-accepts-multiple-id-values –

+0

谢谢桑德拉。这是一个很好的阅读,我会更多地消化它。如果我使用表值的参数,我可以嵌套它们吗?所以我有一个表值的参数,有列表类型的值表巴巴姆?一个列表的集合? – bhs

+0

bhs - 不幸的是,没有。对[用户定义的表类型](http://technet.microsoft.com/en-us/library/bb522526(v = sql.105).aspx)的限制之一是它们不能用作另一列中的列用户定义的表格类型。但是,您可以将两个TVP传递给您的sproc,并带有外键关系。我会以此为例作为答案。 –

回答

0

这里是你如何可以用表值参数做到这一点。这些都是在SQL 2008中引入的,所以如果你选择走这条路线的话,那么这个版本对你的解决方案来说就没问题。在这个测试场景中,我制作了一个主表和一个外键指向主表的相关表。

首先,创建表的数据类型:

CREATE TYPE primary_tbltype AS TABLE 
    (personkey int NOT NULL PRIMARY KEY, 
    firstname varchar(30), 
    lastname varchar(30)) 

CREATE TYPE related_tbltype AS TABLE 
    (fk_personkey int NOT NULL, 
    accountnum varchar(30), 
    accountbalance money) 

创建存储过程:

CREATE PROCEDURE MySproc 
    @PrimaryTable primary_tbltype READONLY, 
    @RelatedTable related_tbltype READONLY 
AS 
BEGIN 
DECLARE @CurrentKey INT 
DECLARE @FirstName VARCHAR(30) 
DECLARE @LastName VARCHAR(30) 
DECLARE @AccountTotal MONEY 

DECLARE PersonCursor CURSOR LOCAL FAST_FORWARD FOR 
    SELECT personkey, firstname, lastname FROM @PrimaryTable 
OPEN PersonCursor 
FETCH NEXT FROM PersonCursor INTO @CurrentKey, @FirstName, @LastName 
WHILE @@FETCH_STATUS= 0 BEGIN 

    SELECT @AccountTotal = SUM(accountbalance) FROM @RelatedTable 
     WHERE fk_personkey = @CurrentKey 

    PRINT @FirstName + ' ' + @LastName + ' - account total: ' + CONVERT(VARCHAR(30), @AccountTotal) 

    FETCH NEXT FROM PersonCursor INTO @CurrentKey, @FirstName, @LastName 
END 
END; 

下面是一些测试数据来尝试一下:

DECLARE @primaryTVP primary_tbltype 
DECLARE @relatedTVP related_tbltype 

INSERT INTO @primaryTVP values (1, 'John', 'Cleese') 
INSERT INTO @primaryTVP values (2, 'Eric', 'Idle') 
INSERT INTO @primaryTVP values (3, 'Graham', 'Chapman') 

INSERT INTO @relatedTVP values (1, '29310918', 28934.33) 
INSERT INTO @relatedTVP values (2, '123123', 3418.11) 
INSERT INTO @relatedTVP values (2, '33333', 666.66) 
INSERT INTO @relatedTVP values (3, '554433', 22.22) 
INSERT INTO @relatedTVP values (3, '239482', 151515.15) 


EXEC MySproc @primaryTVP, @relatedTVP; 

一些使用TVPs的优势涵盖了here,他们也能够参与g基于集合的操作。

相关问题