我正在尋找在以下定位技術意見:嘗試使用表值函數
我們先從2個表:
tblProducts : ProductID, Name,Description,SomeAttribute
tblProductsLocalization : ProductID,Language,Name,Description
和表值函數:
CREATE FUNCTION [dbo].[LocalizedProducts](@locale nvarchar(50))
RETURNS TABLE
AS (SELECT a.ProductID,COALESCE(b.Name,a.Name)as [Name],COALESCE(b.Description,a.Description)as [Description],a.SomeAttribute
from tblProducts a
left outer join tblProductsLocalization_Locale b
on a.ProductID= b.ProductID and b.[Language][email protected])
我打算做的是包括功能每當我需要本地化的數據返回:
select * from LocalizedProducts('en-US') where ID=1
代替
select * from tblProducts where ID=1
我很感興趣,如果有重大的性能問題,以防萬一這個或任何攪局者。任何我不應該採用的理由?
編輯:我已經標記了這個SQL2005,儘管我用2008開發了這個,我認爲部署目標只有SQL2005。如果需要,我可以升級到2008年。
後來編輯:
我已經創建了一個視圖,相同的內容,但沒有參數:
CREATE VIEW [dbo].[LocalizedProductsView]
AS
SELECT b.Language,a.ProductID,COALESCE(b.Name,a.Name)as [Name],
COALESCE(b.Description,a.Description)as [Description],a.SomeAttributefrom tblProducts a
left outer join tblProductsLocalization_Locale b on a.ProductID= b.ProductID
我然後繼續運行一些測試: 估計的執行計劃看起來與這兩個查詢:
select * from LocalizedProducts('us-US') where SomeNonIndexedParameter=2
select * from LocalizedProductsView where (Language='us-US' or Language is null) and SomeNonIndexedPramaters=2
最後一個問題,即arrises是:我應該理解TVF是否正在計算所有產品的翻譯,而不管WHERE參數如何?視圖是做同樣的事情嗎?
SQL Server?你能否使用版本(2000 vs. 2005 vs. 2008)?在不同的SQL版本中,處理UDF的方式顯着不同。 – 2009-11-07 17:15:00
@Radu:使用視圖而不是函數。您的功能是作爲SUBSELECT工作 - 不需要它,並且根據將來的使用情況,您可能需要其他相關信息。 – 2009-11-07 17:38:13
據我瞭解,我無法將參數傳遞到視圖,我可以嗎? – Radu094 2009-11-07 17:41:20