【问题标题】:Performance tuning of SQL Server querySQL Server 查询的性能调优
【发布时间】:2016-12-30 11:53:18
【问题描述】:

我收到一些错误,例如:

消息 205,级别 16,状态 1,过程 SearchUserswithLevels,第 29 行
使用 UNION、INTERSECT 或 EXCEPT 运算符组合的所有查询必须在其目标列表中具有相同数量的表达式。

我正在附加我的表格和存储过程

CREATE TABLE [dbo].[Users]
(
    [Login_ID] [bigint] IDENTITY(1,1) NOT NULL,
    [Login_Name] [nvarchar](100) NOT NULL,
    [Login_Password] [nvarchar](100) NULL,
    [CreatedBy] [bigint] NULL,
    [ModifiedBy] [bigint] NULL,
    [Referal_ID] [bigint] NULL,
    [Name] [nvarchar](250) NULL,
    [User_Address] [nvarchar](max) NULL,
    [Phone] [nvarchar](14) NULL,
    [Email] [nvarchar](250) NULL,
    [BankName] [nvarchar](250) NULL,
    [AccountName] [nvarchar](250) NULL,
    [IFSC] [nvarchar](250) NULL,
    [AccountNo] [nvarchar](250) NULL,
    [DOB] [datetime] NULL,
    [Created_Date] [datetime] NULL,
    [Modified_Date] [datetime] NULL,
    [Last_Login_Date_Time] [datetime] NULL,
    [UnsuscribeEmail] [int] NULL,
    [UnsuscribeSms] [int] NULL,
    [IsBanned] [int] NULL,
    [ISDeleted] [int] NULL,
    [Roles] [nvarchar](max) NULL,
    [IDPROF] [nvarchar](250) NULL,
    [IDPROFNO] [nvarchar](250) NULL,
    [PANCARDNO] [nvarchar](250) NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

我的存储过程是这样的:

CREATE PROCEDURE SearchUserswithLevels 
     (@SearchParameter NVARCHAR(250),
      @Referal_ID BIGINT = NULL)
AS
BEGIN
    DECLARE @CURRENTDATE AS DATETIME = GETDATE()

    CREATE TABLE #temptable 
    (
        ID BIGINT,
        Login_Name NVARCHAR(100) NOT NULL,
        NAME NVARCHAR(250) NULL,
        Levels INT,
        Referal_ID BIGINT NULL,
        User_Address NVARCHAR(max) NULL,
        Phone NVARCHAR(14) NULL,
        Email NVARCHAR(250) NULL,
        BankName NVARCHAR(250) NULL,
        AccountName NVARCHAR(250) NULL,
        IFSC NVARCHAR(250) NULL,
        AccountNo NVARCHAR(250) NULL,
        DOB DATETIME NULL,
        IDPROF NVARCHAR(250) NULL,
        IDPROFNO NVARCHAR(250) NULL,
        PANCARDNO NVARCHAR(250) NULL
    )

    ;WITH Hierarchy (
        Login_ID,
        Login_Name,
        NAME,
        Levels,
        Referal_ID,
        User_Address,
        Phone,
        Email,
        BankName,
        AccountName,
        IFSC,
        AccountNo,
        DOB,
        IDPROF,
        IDPROFNO,
        PANCARDNO
    ) AS 
    (
        SELECT 
            Login_ID,
            Login_Name,
            NAME,
            0,
            Referal_ID,
            User_Address,
            Phone,
            Email,
            BankName,
            AccountName,
            IFSC,
            AccountNo,
            DOB,
            IDPROF,
            IDPROFNO,
            PANCARDNO
        FROM 
            Users AS FirtGeneration
        WHERE 
            Referal_ID = @Referal_ID

        UNION ALL

        SELECT 
            NextGeneration.Login_ID,
            NextGeneration.Login_Name,
            NextGeneration.NAME,
            Parent.Levels + 1,
            Parent.Login_ID
            User_Address,
            NextGeneration.Phone,
            NextGeneration.Email,
            NextGeneration.BankName,
            NextGeneration.AccountName,
            NextGeneration.IFSC,
            NextGeneration.AccountNo,
            NextGeneration.DOB,
            NextGeneration.IDPROF,
            NextGeneration.IDPROFNO,
            NextGeneration.PANCARDNO
        FROM
            Users AS NextGeneration
        INNER JOIN 
            Hierarchy AS Parent ON NextGeneration.Referal_ID = Parent.Login_ID
    )
    INSERT INTO #temptable
        SELECT 
            Login_ID, Login_Name, NAME,
            (Levels + 1) AS Levels,
            Referal_ID,
            User_Address,
            Phone, Email, BankName, AccountName,
            IFSC, AccountNo, DOB, IDPROF, IDPROFNO,
            PANCARDNO   
        FROM 
            Hierarchy
        --WHERE Levels = @Levels
        ORDER BY 
            Login_ID
        OPTION (MAXRECURSION 32767)

    SELECT 
        TP.ID, TP.Login_Name, TP.NAME,
        TP.Levels, TP.Referal_ID, TP.User_Address,
        TP.Phone, TP.Email, TP.BankName, TP.AccountName, TP.IFSC,
        TP.AccountNo, TP.DOB, TP.IDPROF, TP.IDPROFNO
    FROM 
        #temptable as TP
    WHERE 
        (TP.Email LIKE '%' + @SearchParameter + '%')
        OR (TP.Phone LIKE '%' + @SearchParameter + '%')
        OR (TP.NAME LIKE '%' + @SearchParameter + '%')
        OR (TP.ID LIKE '%' + @SearchParameter + '%')
END

【问题讨论】:

  • 您的问题标题是关于性能的,并且您也标记了性能。如果出现错误,性能不是问题!
  • 是的,否决了这个问题。误导性标题和拼写错误很容易找到。这是垃圾问题。

标签: sql-server performance stored-procedures


【解决方案1】:

UNION ALL 之后是这样的:

Parent.Login_ID
User_Address,

Sql Server 将其解释为

Parent.Login_ID AS User_Address,

这使它成为 1 个字段,而不是您可能想要的 2 个字段。添加一个逗号就完成了。

【讨论】:

    【解决方案2】:

    您在表#temptable 中缺少TP.PANCARDNO

     INSERT INTO #temptable
        SELECT Login_ID,
            Login_Name,
            NAME,
            (Levels + 1) AS Levels,
            Referal_ID,
            User_Address,
            Phone,
            Email,
            BankName,
            AccountName,
            IFSC,
            AccountNo,
            DOB,
            IDPROF,
            IDPROFNO,
            PANCARDNO   FROM Hierarchy
        --WHERE Levels = @Levels
        ORDER BY Login_ID
        OPTION (MAXRECURSION 32767)
    
        SELECT TP.ID,
            TP.Login_Name,
            TP.NAME,
            TP.Levels,
            TP.Referal_ID,
            TP.User_Address,
            TP.Phone,
            TP.Email,
            TP.BankName,
            TP.AccountName,
            TP.IFSC,
            TP.AccountNo,
            TP.DOB,
            TP.IDPROF,
            TP.IDPROFNO,
            TP.PANCARDNO
        FROM #temptable as TP
    

    【讨论】:

      猜你喜欢
      • 2019-08-07
      • 2016-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多