我有我使用的多行數據擠入一個變量,像這樣一個存儲過程:替代CROSS APPLY
DECLARE @Description VARCHAR(200);
SELECT @Description = COALESCE(@Description) + ', ', '') + [Description]
FROM dbo.DrugDescriptionAndImprints
WHERE NDC = @NDC;
我的問題是,我最近有需要做到這一點多的NDC同時生成報告數據。
我目前的解決方案是使用具有表值函數的CROSS APPLY
,但由於性能影響,這不是最優的。我希望能夠在視圖或其他東西中「平整」這些數據,但無法在視圖中使用變量。有沒有辦法做到這一點,而不使用CROSS APPLY
和表值函數?
下面是引用表值函數:
CREATE FUNCTION [dbo].[fnFlatDescriptionByNdc]
(
@NDC VARCHAR(11)
)
RETURNS
@ret TABLE
(
[Description] VARCHAR(200)
)
AS
BEGIN
DECLARE @Description VARCHAR(200)
DECLARE @Imprint1 VARCHAR(40)
DECLARE @Imprint2 VARCHAR(40)
SELECT @Description = Coalesce(@Description + ', ', '') + [Description]
FROM dbo.DrugDescriptionAndImprints WHERE NDC = @NDC
SELECT @Imprint1 = COALESCE(Imprint1, '')
FROM dbo.DrugDescriptionAndImprints WHERE NDC = @NDC
ORDER BY Imprint1 DESC
SELECT @Imprint2 = COALESCE(Imprint2, '')
FROM dbo.DrugDescriptionAndImprints WHERE NDC = @NDC
ORDER BY Imprint2 DESC
INSERT INTO @ret ([Description])
SELECT @Description + CASE WHEN @Imprint1 <> '' OR @Imprint2 <> '' THEN ' (' +
CASE WHEN @Imprint1 <> '' THEN @Imprint1 +
CASE WHEN @Imprint2 <> '' THEN '/' + @Imprint2
ELSE ''
END
ELSE @Imprint2 END + ')' ELSE '' END
RETURN
END
我與SQL Server 2008 R2的工作。
編輯 下面是一些示例數據顯示什麼我一起工作:
NDC ProdDescAbbr Description Imprint1 Imprint2
00005250033 FIBERCON TAB 625MG film-coated LL F 1
00005250033 FIBERCON TAB 625MG tan LL F 1
00005250033 FIBERCON TAB 625MG scored LL F 1
00005250033 FIBERCON TAB 625MG oblong LL F 1
你是正確的,我正在使用'CROSS APPLY'加入到UDF。我試圖完成的是將NDC的所有「Description」字段合併爲一個值(每個NDC),並且在查詢中使用該值,結果中將包含多個NDC。我會盡力讓你的解決方案適應我的情況,並看看它是如何發展的。謝謝。 –
我已經能夠將CTE應用到我的用例中,而且的確比我之前嘗試做的要快得多。我仍然希望將其清理一些,甚至以某種方式將'concatenatedString'信息移到一個視圖中。 –
普通視圖不會爲性能做任何事情,因爲視圖基本上只是一個子查詢的封裝,在運行時與查詢的其餘部分一起執行。索引視圖可能會提高查詢性能,但也有一些缺點,例如需要進行模式綁定和插入時性能下降。根據數據更改的頻率以及數據在查詢時需要的新鮮度,您可以通過計劃作業進行一些聚合。此外,請檢查您現在的執行計劃,並確保您不缺少任何索引。 – btberry