2016-04-14 30 views
0
ALTER PROCEDURE [dbo].[TEST_01]  
    (
     @StartDate DateTime, 
     @EndDate DateTime 
    ) 
    AS  
    BEGIN  
     SET NOCOUNT ON; 
     Declare @sql as nvarchar(MAX); 
     SET @sql = @sql + ';WITH CTE_ItemDetails 
       MAX(D.Name) as Name, 
       SUM(ISNULL(DT.col1, 0)) AS col1, 
       SUM(ISNULL(DT.col2, 0)) AS col2, 
       SUM(ISNULL(DT.col3, 0)) AS col3, 
       GROUPING(D.ItemType) AS ItemTypeGrouping 
      FROM Items D 
       INNER JOIN Details DT ON DT.ItemId = D.ItemId 
       INNER JOIN Report R ON R.ReportId = DT.ReportId 
       where 1=1' 
      SET @sql = @sql + ' AND (R.ReportDate >= ' + @StartDate + 'AND R.ReportDate <=' + @EndDate +')' 

      IF @someOtherVariable is not null 
      SET @sql = @sql + ' AND R.someColumn IN (''' +replace(@someOtherVariableValues,',','')+''+')' 

      SET @sql = @sql + 'SELECT col1, col2, col3 FROM CTE_ItemDetails' 
      EXECUTE (@sql) 
    END 

Yukarıdaki T-SQL koduna benzer bir saklı yordamım var. bunu yürütmek zaman aşağıdaki hatayı alıyorum (i hissetmek çok fazla kod kaldırdık Not hatası i alıyorum alakalı değildir). karakter dizesinden datetime dönüştürme işlemi sırasındaHata iletisi Dönüştürme, dize tarihini karakter dizisinden dönüştürürken başarısız oldu

Dönüşüm başarısız oldu.

Benim parametreleri formatında aşağıdan değerlere sahip

exec TEST_01 @StartDate=N'4/1/2016 12:00:00 AM',@EndDate=N'4/30/2016 12:00:00 AM' 

sorun i dinamik nedir

SET @sql = @sql + ' AND (R.ReportDate >= ' + @StartDate + 'AND R.ReportDate <=' + @EndDate +')' 

altında hattında SQL deyimi ayarlıyorum şekilde gibi görünüyor En iyi tarih biçimlendirme hatalardan kaçınmak için başvurabilirim.

+0

Tarihler belirtmeniz gerekiyor, bunu '@sql +' ve (R.ReportDate> = '' '+ @StartDate +' '' ve R.ReportDate <= '' '+ @EndDate +' olarak değiştirmeniz gerekir. '') '' – Siyual

+0

@Siyual bu – StackTrace

cevap

1

Sen sp_executesql aracılığıyla parametreleri kullanmalıdır.

Ama acil sorunu bu çizgidir:

SET @sql = @sql + ' AND (R.ReportDate >= ''' + convert(varchar(10), @StartDate, 121) + ''' AND R.ReportDate <= ''' + convert(varchar(10), @EndDate, 121) +''')' ; 

Not bir dizeye açık tip döküm dahil ve tarihe böylece çift tek tırnak: Daha gibi görünmelidir

SET @sql = @sql + ' AND (R.ReportDate >= ' + @StartDate + 'AND R.ReportDate <=' + @EndDate +')' 

literal 2016 - 04 - 14 (yani 2000) olarak yorumlanmaz. SQL deyimi daha kolay okunmasını

SET @sql = @sql + ' AND (R.ReportDate >= @StartDate AND R.ReportDate <= @EndDate)' ; 

. . . 
exec sp_executesql @sql, N'@StartDate date, @EndDate date)', @StartDate = @StartDate, @EndDate = @EndDate; 

: gibi

parametreleri kullanarak daha iyi bir yöntem görünüyor. Tip sorunları parametreler aracılığıyla ele alınır. Ve, sorgu planı daha kolay saklanır. Maalesef, parametreler yalnızca sütunlar veya tablo adları için değil, yalnızca sabitler için çalışır.

+0

aynı hata döndürür' sp_executesql 'kullanır ve sql dizesi eklenmemiş bir parametre iletir, çünkü boş veya boş olarak bulundu? i (i başlangıçta yayınlandığı komut gösterilmiştir) birkaç fazla parametre ekliyorum çünkü bu soruyorum. Bunu göstermek için kodumu güncelledim. – StackTrace

+0

@StackTrace. . . parametreler, ikinci ve üçüncü argüman bildirilmiştir Eğer SQL dizesinde ise, o zaman önemli değil. –

İlgili konular