"数组参数"TSQL

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或者只是有些错误?任何建议表示赞赏

在此先感谢约翰

SQL*_*ace 10

看看Erland Sommarskog 在SQL Server中的数组和列表