我们如何将IN SQL语句用于SQL SERVER函数

时间:2014-10-29 10:47:57

标签: sql sql-server

我们如何将IN语句用于sql server函数。

这是我的代码:

ALTER FUNCTION [dbo].[getMentalTable]
( 
@Code  VARCHAR(50),
@Statu VARCHAR(10),
@donem1 VARCHAR(10),
@donem2 VARCHAR(10),
@principal VARCHAR(10)
)
RETURNS TABLE
AS
RETURN
(
SELECT
                  m.Code,
                  m.CodeType,
                  k.TANIM,
                    kart.DonemAdi,
                    COUNT(DISTINCT m.DRGPatientId) AS VakaSayısı
                FROM
                    TIGTest.dbo.MentalBozuklukVerileriOzet m,
                    TIGTest.dbo.KART_DONEM kart,
                    TIGTest.dbo.Hospitals h,
                  KODLAR k
                WHERE m.Code IN(@Code)
                AND kart.DonemKodu = m.DonemKodu
                AND h.HospitalCode = m.HospitalCode
                AND h.Statu='D'
                AND m.DonemKodu BETWEEN @donem1 AND @donem2
                AND k.KOD2=m.Code
                AND m.IsPrincipal=@principal
                GROUP BY
                    kart.DonemAdi,
                    m.DonemKodu,
                  m.Code,
                  m.CodeType,
                  k.TANIM,
                    kart.DonemAdi
)

我想在@Code变量中设置多个参数。所以这使用了无法工作。我们如何在sql server函数中使用IN语句。

谢谢。

3 个答案:

答案 0 :(得分:1)

试试这个(考虑到@code将有CSV)..你需要将你的CSV转换为行以与IN运算符进行比较

....
WHERE m.Code IN (SELECT Split.a.value('.', 'VARCHAR(100)')
FROM   (SELECT Cast ('<M>' + Replace(@Code, ',', '</M><M>') + '</M>' AS XML) AS code) AS A
       CROSS APPLY code.nodes ('/M') AS Split(a))
AND...

答案 1 :(得分:0)

一种方法是使用动态SQL。也就是说,将代码列表嵌入到字符串中。

另一种方法是使用CTE将列表拆分为表并使用joinin

第三种方法更易于编写,但无法利用m.Code上的索引,是:

 WHERE ',' + @Code + ',' like '%,' + m.Code + ',%'

为此目的使用like

答案 2 :(得分:0)

您是否考虑过表值参数?在单个参数(分隔列表或XML)中传递列表将需要在服务器端进行解析,并且效率低于TVP。以下是TVP示例。

CREATE TYPE CodesType AS TABLE(
    Code varchar(50) NOT NULL PRIMARY KEY
    );
GO

CREATE FUNCTION [dbo].[getMentalTable]
( 
@Codes dbo.CodesType READONLY,
@Statu VARCHAR(10),
@donem1 VARCHAR(10),
@donem2 VARCHAR(10),
@principal VARCHAR(10)
)
RETURNS TABLE
AS
RETURN
(
SELECT
                  m.Code,
                  m.CodeType,
                  k.TANIM,
                    kart.DonemAdi,
                    COUNT(DISTINCT m.DRGPatientId) AS VakaSayısı
                FROM
                    TIGTest.dbo.MentalBozuklukVerileriOzet m,
                    TIGTest.dbo.KART_DONEM kart,
                    TIGTest.dbo.Hospitals h,
                  KODLAR k
                WHERE m.Code IN(SELECT Code FROM @Codes)
                AND kart.DonemKodu = m.DonemKodu
                AND h.HospitalCode = m.HospitalCode
                AND h.Statu='D'
                AND m.DonemKodu BETWEEN @donem1 AND @donem2
                AND k.KOD2=m.Code
                AND m.IsPrincipal=@principal
                GROUP BY
                    kart.DonemAdi,
                    m.DonemKodu,
                  m.Code,
                  m.CodeType,
                  k.TANIM,
                    kart.DonemAdi
);
GO

DECLARE @Codes dbo.CodesType;
INSERT INTO @Codes VALUES('1'), ('2');
SELECT * 
FROM [dbo].[getMentalTable](@Codes,'a','b','c','d');
GO