jmw*_*jmw 2 t-sql sql-server-2005
我有一个带有呼叫数据记录的表,每个呼叫有一个呼叫数据,其中一个字段是我们在查询数据库时使用的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
Run Code Online (Sandbox Code Playgroud)
我使用表变量来存储我拆分的临时表和| 我们作为参数传入的分隔字符串.SplitDelimitedVarChar SQL函数切割VarChar并返回Table变量.时间和日期值存储为整数.
WHERE子句中使用的所有字段都已编制索引.
当分隔的字符串参数很短但当它变大时(upp到由|分隔的几百个字符串),这可以正常工作,执行查询需要相当长的时间.
因为我显然不是SQL大师,我觉得有可能有人能告诉我,我是不是很糟糕的SQL或者只是有些错误?任何建议表示赞赏
在此先感谢约翰