2016-12-30 3 views
0

Я получаю некоторые ошибки, как:Выполнение запроса SQL Server

Msg 205, уровень 16, состояние 1, процедура SearchUserswithLevels, Линия 29
Все запросы в сочетании с использованием UNION, INTERSECT или КРОМЕ оператор должен имеют равное количество выражений в своих целевых списках.

Я прилагаю мои таблицы, а также хранимую процедуру

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

Ваш заголовок речь идет о производительности, и вы помечено производительность, а также. Если вы получите сообщение об ошибке, производительность - это не вопрос! – HoneyBadger

+0

Да, поставил вопрос. Вводящий в заблуждение заголовок и опечатка ошибки легко-peasy, чтобы найти. Это вопрос мусора. – cybernetic87

ответ

5

После UNION ALL есть это:

Parent.Login_ID 
User_Address, 

который интерпретируется Sql Se rver as

Parent.Login_ID AS User_Address, 

Это делает его 1 полем, а не 2, как вы, вероятно, предназначили. Добавьте запятую, и все готово.

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 
Смежные вопросы