将多个参数传递给表值函数

Posted

技术标签:

【中文标题】将多个参数传递给表值函数【英文标题】:Passing multiple parameters into a Table valued function 【发布时间】:2013-11-27 06:26:50 【问题描述】:

我有一个表值函数,如下所示。当我试图同时传递多个参数时,我收到一个错误,例如“函数指定了太多参数”。

CREATE FUNCTION [dbo].[GetCompanyUsers](@CompanyId  BIGINT)    
RETURNS @Users TABLE (Id BIGINT,Contact NVarchar(4000)) 
AS 
BEGIN 
INSERT INTO @Users(Id,Contact)
SELECT [Id]
  ,ISNULL([FirstName],'')+' ' +ISNULL([LastName],'') AS [Contact]
FROM [dbo].[CompanyAddressesContacts]
WHERE  [CompanyId]=@CompanyId
ORDER BY ISNULL([FirstName],'')+' ' +ISNULL([LastName],'')

RETURN 

END 

我需要在上面的代码中进行哪些修改,以便它允许多个值,并且我需要在我的数据集中的“WHERE”条件下使用该函数。

WHERE(Document_RFIs.CreatedBy IN
               (SELECT Id FROM dbo.GetCompanyUsers(@CompanyId)))

【问题讨论】:

您是否尝试过使用这样的连接? INNER JOIN dbo.GetCompanyUsers(@CompanyId) GCU ON GCU.Id = Document_RFI.CreatedBy 你传递了多少个参数? @Raphael 是的,我试过了。但是我得到了同样的错误“过程或函数指定了太多参数” 参数的数量可能会因所选公司的数量而异。它可以在 1 到多个之间变化,例如dbo.GetCompanyUsers(23,24,25) companyid 值是如何传递到 sql 中的? SQL 中的参数数量不能变化。他们在哪里selected 【参考方案1】:

这可能会有所帮助(但基本问题是 - 除非绝对必要,否则应避免传递逗号分隔的字符串 - 这解释了为什么您收到的答案如此之少):-

--set nocount on

--create table #Document_RFIs (
--  CreatedBy varchar(50),
--  columna varchar(50),
--  columnb varchar(50),
--  columnc varchar(50)

--)
--insert into #Document_RFIs values 
--  ('albert einstein','another','value',null),
--  ('marie curie','some',null,'tuna'),
--  ('isaac newton','why','not','provide'),
--  ('kepler','some','test','data'),
--  ('robert boyle','with','your','question'),
--  ('john dalton','it',null,'would'),
--  ('enrico fermi','make','helping','you'),
--  ('peter higgs','so','much','easier')

--create table #CompanyAddressesContacts (
--  companyid int,
--  firstname varchar(50),
--  lastname varchar(50)
--)
--insert into #CompanyAddressesContacts values (22,'albert','einstein')
--insert into #CompanyAddressesContacts values (23,'marie','curie')
--insert into #CompanyAddressesContacts values (23,'isaac','newton')
--insert into #CompanyAddressesContacts values (24,null,'kepler')
--insert into #CompanyAddressesContacts values (25,'robert','boyle')
--insert into #CompanyAddressesContacts values (25,'enrico','fermi')
--insert into #CompanyAddressesContacts values (26,'peter','higgs')

declare @ids varchar(1024)

set @ids='23,24,25'

create table #id (
    companyid int
)

declare @pos int

while DATALENGTH(@ids)>0 begin
    set @pos=charindex(',',@ids)
    if @pos>0 begin
        insert into #id values (left(@ids,@pos-1))
        set @ids=SUBSTRING(@ids,@pos+1,DATALENGTH(@ids))
    end else begin
        insert into #id values (@ids)
        set @ids=''
    end
end

select d.*
from #Document_RFIs d
where exists(
    select cac.*
    from #CompanyAddressesContacts cac
    join #id i on i.companyid=cac.companyid
    where isnull(cac.firstname+' ','')+isnull(cac.lastname,'')=d.CreatedBy
)

--drop table #id
--drop table #Document_RFIs
--drop table #CompanyAddressesContacts

【讨论】:

【参考方案2】:

我会这样做:

首先将您的@CompanyId 转换为行

WITH CompanyIds AS (
    SELECT Id
    FROM CompanyTable -- Same as the source of the @CompanyId
    WHERE Id IN (@CompanyId)
)

然后提取所有用户

,Users AS (
     SELECT UserId
     FROM CompanyIds
         CROSS APPLY (
             SELECT Id AS UserId
             FROM dbo.GetCompanyUsers(CompanyIds.Id)
         ) AS CA1
 )

然后在where语句中使用

WHERE Document_RFIs.CreatedBy IN (SELECT UserId 
                                  FROM Users)

【讨论】:

以上是关于将多个参数传递给表值函数的主要内容,如果未能解决你的问题,请参考以下文章

如何从.net代码将表值参数传递给存储过程

EF:从 C# 将表值参数传递给用户定义的函数

通过在 SQL Server 2000 中传递变量参数来加入表值函数

将表值参数传递给存储过程

将ajax请求中的多个参数传递给函数后面的C#代码

Django href 将多个参数传递给函数