2013-08-28 2 views
0

мой запрос такой, но он ничего не возвращает @ value0, @ value1, @ value2, @ value3, @ field0 изменяемые поля, они могут быть нулевым значением или значением, зависящим от параметров, поступающих из формы. , например, когда я помещаю эти значения, он ничего не возвращает
@page = 1, @ size = 20, @ sort = N'Id ', @ ts = N'DESC', @ field0 = N'Name ', @ value2 = N'2000-1-1 ', @ value3 = null, @ value1 = null, @ value0 = null Я делаю что-то неправильно?pagination query ничего не возвращает

  @page INT, 
      @size INT,@sort nvarchar(50) , 
      @ts nvarchar(50) , 
      @totalrow INT OUTPUT, 
      @value0 nvarchar(50), 
      @value1 nvarchar(50), 
      @value2 nvarchar(50), 
      @value3 nvarchar(50), 
      @field0 nvarchar(50) 

       AS 
       BEGIN 
        DECLARE @offset INT 
        DECLARE @newsize INT 
        DECLARE @sql NVARCHAR(MAX) 


        IF(@page=0) 
       begin 
       SET @offset = @page; 
       SET @newsize = @size 
       end 
        ELSE 
       begin 
       SET @offset = @page+1; 
       SET @newsize = @size-1 
       end 

        SET NOCOUNT ON; 
       SET @sql = ' 
        WITH OrderedSet AS 
        (
      SELECT Ks.Id,c.Name,c.CId,Ks.RegisterDate,ROW_NUMBER() 
    OVER (ORDER BY ' + @sort + ' '[email protected]+') AS ''Index'' 
      FROM Ks LEFT OUTER JOIN Car c On c.CId=Ks.CId WHERE 
      AND (Ks.RegisterDate >'''[email protected]+''' OR '''[email protected]+''' IS NULL) 
      AND (Ks.RegisterDate <'''[email protected]+''' OR '''[email protected]+''' IS NULL) 
     AND (Ks.RegisterDate ='''[email protected]+''' OR '''[email protected]+''' IS NULL) 
      AND ('[email protected]+' LIKE ''%'[email protected]+'%'' OR @value0 IS NULL) 
     ) 
     SELECT * FROM OrderedSet WHERE [Index] BETWEEN ' + 
CONVERT(NVARCHAR(12), @offset) + ' AND ' + CONVERT(NVARCHAR(12), (@offset + @newsize)) 

        EXECUTE (@sql) 

        SET @totalrow = (SELECT COUNT(*) FROM [dbo].[Ks]) 
        print @sql 

ответ

1

при конкатенации с null на строку, результат null.

Я вижу слишком много ошибок в SQL syntax, для которых я предполагаю коррекцию. Например, если один из @value(n) is not null других 2 @value(n) должна быть NULL

я настоятельно рекомендую вам взглянуть на значении @sql, а затем корректные дальнейшие ошибки.

предполагавшейся способ приблизиться к null параметров значения могут быть:

@page INT, 
      @size INT,@sort nvarchar(50) , 
      @ts nvarchar(50) , 
      @totalrow INT OUTPUT, 
      @value0 nvarchar(50), 
      @value1 nvarchar(50), 
      @value2 nvarchar(50), 
      @value3 nvarchar(50), 
      @field0 nvarchar(50) 

       AS 
       BEGIN 
        DECLARE @offset INT 
        DECLARE @newsize INT 
        DECLARE @sql NVARCHAR(MAX) 


        IF(@page=0) 
       begin 
       SET @offset = @page; 
       SET @newsize = @size 
       end 
        ELSE 
       begin 
       SET @offset = @page+1; 
       SET @newsize = @size-1 
       end 

       DECLARE @Ks_RegisterDate_Condition NVARCHAR(1000) 

       IF (@value1 IS NULL AND @value2 IS NULL AND @value3 IS NULL) 
       BEGIN 
        SET @Ks_RegisterDate_Condition = N'KsRegisterDate IS NULL' 
       END 
       ELSE 
       BEGIN 
        IF (@value1 IS NOT NULL) 
        BEGIN 
         SET @Ks_RegisterDate_Condition = N'(Ks.RegisterDate ='''[email protected]+'''' 
        END 
        IF (@value2 IS NOT NULL) 
        BEGIN 
         SET @Ks_RegisterDate_Condition = N'(Ks.RegisterDate >'''[email protected]+'''' 
        END 
        IF (@value3 IS NOT NULL) 
        BEGIN 
         SET @Ks_RegisterDate_Condition = N'(Ks.RegisterDate >'''[email protected]+'''' 
        END 
       END 

       IF (NOT (@field0 IS NULL OR @value0 IS NULL)) 
       BEGIN 
        SET @Ks_RegisterDate_Condition += + N'AND ' + @field0+N' LIKE ''%'[email protected]+N'%''' 
       END 

        SET NOCOUNT ON; 
       SET @sql = ' 
        WITH OrderedSet AS 
        (
      SELECT Ks.Id,c.Name,c.CId,Ks.RegisterDate,ROW_NUMBER() 
    OVER (ORDER BY ' + @sort + ' '[email protected]+') AS ''Index'' 
      FROM Ks LEFT OUTER JOIN Car c On c.CId=Ks.CId WHERE ' + 
      @Ks_RegisterDate_Condition + ' 
     ) 
     SELECT * FROM OrderedSet WHERE [Index] BETWEEN ' + 
CONVERT(NVARCHAR(12), @offset) + ' AND ' + CONVERT(NVARCHAR(12), (@offset + @newsize)) 

        print @sql 
        EXECUTE (@sql) 

        SET @totalrow = (SELECT COUNT(*) FROM [dbo].[Ks]) 
+0

но в этом случае @ value1 и @ значение2 не равно нулю, в то же время, он получит только одно условие не оба – sakir

+1

так просто измените логику, чтобы добавить условие «AND» (или «OR») между ними и добавить условия, что-то вроде «... DECLARE @Ks_RegisterDate_Condition NVARCHAR (1000); set @Ks_RegisterDate_Condition = '' ... 'then, if становится' SET @Ks_RegisterDate_Condition = случай, когда @Ks_RegisterDate_Condition <> '', затем N 'и' else '' end + N '(Ks.RegisterDate>' '' + @ value2 + '' '' ' –

+0

Я предполагаю, что u должен добавить + знак too.SET @Ks_RegisterDate_Condition = + – sakir

Смежные вопросы