SQL Server查询

时间:2016-12-30 11:53:19

标签: sql-server performance stored-procedures

我遇到了一些错误:

  

Msg 205,Level 16,State 1,Procedure 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

2 个答案:

答案 0 :(得分:5)

UNION ALL后有:

Parent.Login_ID
User_Address,

由Sql Server解释为

Parent.Login_ID AS User_Address,

这使得它成为1场,而不是你想要的2场。添加一个逗号就可以了。

答案 1 :(得分:0)

您在表TP.PANCARDNO

中缺少#temptable
 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