簡體   English   中英

我們如何使用IN SQL語句轉換為SQL SERVER函數

[英]How can we use IN SQL Statement into SQL SERVER Function

我們如何使用IN語句轉換成sql服務器功能。

這是我的代碼:

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變量中設置多個參數, @Code這不能使用。我們如何在SQL Server函數中使用IN語句。

謝謝 。

試試這個(考慮到@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...

一種方法是使用動態SQL。 即,將代碼列表嵌入字符串中。

另一種方法是使用CTE將列表拆分成表並使用joinin

第三種更易於編寫但無法利用m.Code上的索引的m.Code是:

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

為此使用like這樣。

您是否考慮過表值參數? 在單個參數(定界列表或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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM