我有一个表,其中包含呼叫数据记录,每个呼叫都有一个呼叫数据记录,其中一个字段是我们在查询数据库时使用的 CallerId。
我们使用下面的 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 子句中使用的所有字段都已建立索引。
当分隔字符串参数很短时,这种方法效果很好,但当它变大时(最多由 | 分隔的数百个字符串),执行查询需要相当长的时间。
因为我显然不是 SQL 专家,所以我觉得可能有人可以告诉我我是否真的很糟糕 att SQL 或者只是有某些部分错误?任何建议表示赞赏
提前致谢
约翰