我有一個呼叫數據記錄表,其中每個呼叫都有一個呼叫數據,其中一個字段是我們在查詢數據庫時使用的CallerId。「數組參數」TSQL
我們使用下面的TSQL來模擬數組參數,這是要走還是走的路?
ALTER PROCEDURE [dbo].[spStudio_Get_Smdr]
@beginTime INT,
@endTime INT,
@subscribers VARCHAR(MAX) = NULL,
@exchanges VARCHAR(MAX) = '1:',
@beginDateValue int,
@endDateValue int
AS
BEGIN
SET NOCOUNT ON;
DECLARE @exch TABLE(Item Varchar(50))
INSERT INTO @exch
SELECT Item FROM [SplitDelimitedVarChar] (@exchanges, '|') ORDER BY Item
DECLARE @subs TABLE(Item Varchar(19))
INSERT INTO @subs
SELECT Item FROM [SplitDelimitedVarChar] (@subscribers, '|') ORDER BY Item
SELECT
,[Level]
,[Timestamp]
,[EndYear]
,[EndDate]
,[EndTime]
,[CallingNumber]
,[DialledNumber]
..more fields between
,[DateValue]
,[TimeValue]
FROM [SmdrFormat] AS S
WHERE
(S.[DateValue] BETWEEN @beginDateValue AND @endDateValue)
AND
(S.[TimeValue] BETWEEN @beginTime AND @endTime)
AND
EXISTS(SELECT [Item] FROM @exch WHERE [Item] = S.[Level])
AND
(@subscribers IS NULL OR (EXISTS(SELECT [Item] FROM @subs WHERE [Item] = S.[CallingNumber]
OR [Item] = S.[DialledNumber])))
END
我使用表變量來存儲我從和分裂臨時表|分隔的字符串,我們作爲參數傳入。 SplitDelimitedVarChar SQL函數將一個VarChar分割並返回一個Table變量。時間和日期值以整數形式存儲。
對WHERE子句中使用的所有字段進行索引。
當分隔字符串參數很短但變大時(upp爲幾個由|分隔的數百個字符串),這可以正常工作,執行查詢需要相當長的時間。
因爲我明顯不是SQL大師,我覺得有可能有人能告訴我,如果我真的很糟糕att SQL或只是得到了一些部分錯誤?任何建議表示讚賞
在此先感謝 約翰
耶,馬上解決了我的問題......絕對是我未來參考文獻的候選名單。 – jcolebrand 2010-04-12 17:13:27