Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: przekazywanie wartości NULL do dynamicznego SQL
Forum PHP.pl > Forum > Bazy danych > Microsoft SQL Server / MSDE
rydlik
Witajcie, mam pytanie, jak przekazać wartość NULL aby została ona poprawnie wyświetlona w EXEC - dynamicznym sqlu. Mój przykład:

  1. SET QUOTED_IDENTIFIER OFF
  2. DECLARE @Radius FLOAT
  3. DECLARE @Diameter INTEGER
  4.  
  5. SET @Radius = 12.5
  6. SET @Diameter = NULL
  7.  
  8. EXEC("
  9. -- w tym wypadku wartość @Diameter jest polem pustym
  10. SELECT '"+@Radius+"' , '"+@Diameter +"'
  11. ")
  12.  
  13. -- poniższe polecenie zwraca poprawnie ponieważ nie jest w EXEC, i zwraca za parametr @Diameter wartość NULL
  14. SELECT @Radius ,@Diameter



bardzo proszę o pomoc
juris
Polecałbym (jeśli już musisz stosować dynamiczny SQL) wykonywanie go za pomocą procedury sp_executesql. Dodatkowo, warto jawnie zapewnić konwersję na typ znakowy.

  1. SET QUOTED_IDENTIFIER OFF
  2. DECLARE @Radius FLOAT
  3. DECLARE @Diameter INTEGER
  4.  
  5. DECLARE @tempSQL nvarchar(1000)
  6.  
  7. SET @Radius = 12.5
  8. SET @Diameter = NULL
  9.  
  10. SET @tempSQL= 'SELECT ' + ISNULL( cast(@Radius AS varchar) ,'NULL') + ' , ' + ISNULL( cast(@Diameter AS varchar) ,'NULL') ;
  11.  
  12. exec (@tempSQL)
  13. exec sp_executesql @tempSQL
rydlik
jeśli by to kogoś jeszcze interesowało, zgodzę się z moim przedmówcą. należy użyc funkcji sp_executesql ale w ten sposób:

  1. SET QUOTED_IDENTIFIER OFF
  2.  
  3. DECLARE @Radius FLOAT
  4. DECLARE @Diameter INTEGER
  5.  
  6. SET @Radius = 12.5
  7. SET @Diameter = NULL
  8.  
  9.  
  10. -- złe rozwiązanie
  11. EXEC("
  12. -- w tym wypadku wartość pola jest pusta
  13. SELECT '"+@Radius+"' , '"+@Diameter +"'
  14. ")
  15.  
  16. -- poprawne ROZWIĄZANIE
  17. DECLARE @SQL NVARCHAR(max)
  18. SET @SQL = 'SELECT @Radius_ds, @Diameter_ds'
  19. EXEC sp_executesql @SQL,
  20. N'@Diameter_ds integer, @Radius_ds float',
  21. @Radius_ds = @Radius, @Diameter_ds = @Diameter
  22.  
  23.  
  24. -- poniższe polecenie zwraca poprawnie ponieważ nie jest w EXEC, i zwraca za parametr @Diameter wartość NULL
  25. SELECT @Radius ,@Diameter



pozdrawiam
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.