2015-06-24 11 views
8

Przeprowadzam dynamiczne zapytanie SQL. gdzie parametry są przekazywane dynamicznie. Najpierw napisałem podobnie do następującego kodu.Przekazywanie parametru wartości Null do dynamicznego zapytania SQL. Jak można to z powodzeniem wykonać?

DECLARE @Id nvarchar(max); 
DECLARE @query nvarchar(max); 
SET @Id ='RMH_108' 
SET @query ='Select * 
      FROM [A06].[Syn_RMDemand] 
      WHERE RMHierarchyId =' + @Id 
PRINT @query 
EXEC(@query) 

Error

Wtedy to pisałem.

DECLARE @Id nvarchar(max); 
DECLARE @query nvarchar(max); 
SET @Id ='RMH_108' 
SET @query ='Select * 
      FROM [A06].[Syn_RMDemand] 
      WHERE RMHierarchyId = '''[email protected]+'''' 
PRINT @query 
EXEC(@query) 

ERROR

Kod ten czas pomyślnie wykonana. Ponieważ parametr może być pusty, muszę przekonwertować go na wartość null. I zmodyfikowany kod i napisał ten

DECLARE @Id nvarchar(max); 
DECLARE @query nvarchar(max); 
SET @Id = '' 
SET @Id = NULLIF(@Id,'') 
-- COMMENTED SET @Id ='RMH_108' 

SET @query ='Select * FROM [A06].[Syn_RMDemand] 
      WHERE RMHierarchyId = '''[email protected]+'''' 
PRINT @query 
EXEC(@query) 

Error

bez błędów. Zapytanie się zawiesiło.
Czy ktoś ma taki problem?

+2

[Dynamic warunków wyszukiwania w T-SQL] (http://www.sommarskog.se/dyn-search.html) Erland Sommarskog byłby dobry czytam dla ciebie, jak sądzę. –

+1

wypróbować ten zestaw @query = 'Select * z [A06]. [Syn_RMDemand] GDZIE RMHierarchyId =' '' + IsNull (Konwersja (VARCHAR, @id), '') + ''” ' EXEC (@ zapytanie) –

+0

Dzięki @ArunprasanthKV .. to działa. –

Odpowiedz

1

Nie ma potrzeby, aby przekształcić go NULL po prostu skontaktować się z swoją wartość

DECLARE @Id nvarchar(max); 
DECLARE @query nvarchar(max); 
SET @Id = '' 


          -- COMMENTED SET @Id ='RMH_108' 
SET @query ='Select * FROM [A06].[Syn_RMDemand] 
      WHERE RMHierarchyId = '''[email protected]+'''' 
PRINT @query 
EXEC(@query) 
3

Spróbuj wykonać następujące czynności:

SET @query ='Select * FROM [A06].[Syn_RMDemand]' 
IF @Id IS NOT NULL 
    SET @query = @query + ' WHERE RMHierarchyId = '''[email protected]+'''' 

Jeśli parametr pochodzi od klienta lepiej zrobić z zapytaniem parametryzowaną (patrz @ ughai za odpowiedź) w celu wykluczenia możliwości sql injection ...

+0

@Giogi Nakeuri. Dzięki. To dało wynik. Ale mam pytanie. co się stanie, jeśli mamy wiele takich parametrów. czy muszę sprawdzić każdy parametr na wartość pustą? –

+1

Powinieneś polecić użycie 'sp_executesql' z parametrami zamiast konkatenacji ciągów znaków – ughai

1

Spróbuj tego.

SET @query ='Select * FROM [A06].[Syn_RMDemand] 
      WHERE RMHierarchyId = ' + ISNULL(@Id , '') 
+0

Ten sam wynik. Brak danych wyjściowych. –

+0

@ArunprasanthKV To nie działa. Co to jest składnia "(at) query"? –

3

Powinieneś użyć sp_executeSQL i usunąć konkatenację ciągów w ten sposób. Zakładam, że jeśli przekazano NULL, wszystkie wiersze mają zostać zwrócone.

Zapytanie

DECLARE @Id nvarchar(max); 
DECLARE @query nvarchar(max); 
SET @Id ='RMH_108'SET @query ='Select * 
           FROM [A06].[Syn_RMDemand] 
           WHERE RMHierarchyId = @Id OR @ID IS NULL' 
PRINT @query 
EXEC sp_executeSQL @query,N'@Id NVARCHAR(MAX)',@Id 
+0

Dzięki. to również dało wynik. –

0
DECLARE @Id nvarchar(max); 
DECLARE @query nvarchar(max); 

SET @query = N'SELECT * FROM [A06].[Syn_RMDemand] ' + CHAR(10) 

IF @Id IS NOT NULL BEGIN 
    SET @query = @query + N'WHERE RMHierarchyId = @param_id' 
END 
ELSE BEGIN 
    SET @query = @query + N'WHERE RMHierarchyId IS NULL' 
END 

PRINT @query 

EXEC sp_executesql 
     @statement = @query, 
     @params = N'@param_id VARCHAR(MAX)', 
     @param_id = @Id 

Należy stosować kwerendy parametryczne podczas korzystania z dynamicznego SQL, aby uniknąć SQL Injection. Przeczytaj this, aby uzyskać więcej informacji.

Jeśli chcesz zwrócić wszystkie wiersze, jeśli przekazana @Id jest NULL, po prostu usuń część ELSE.

+0

jedną z prawidłowych wartości jest '' RMH_108''. '@ Param' powinno być' VARCHAR'/'NVARCHAR' zamiast' @param_id integer' – ughai

+0

@ughai, dzięki za złapanie tego. –

0

Jestem ciekaw, dlaczego nikt nie sugeruje, nie ma potrzeby korzystania z dynamicznego SQL tutaj

Select * 
FROM [A06].[Syn_RMDemand] 
WHERE NULLIF(@Id, '') IS NULL OR RMHierarchyId = @Id 
1

spróbować

SET @query = 'Select * FROM [A06].[Syn_RMDemand] WHERE RMHierarchyId=''' + isnull(Convert(VARCHAR, @id), '') + ''' ' 

    EXEC (@query) 
2

Wszystko z arytmetyczną wartości NULL da NULL.

zrobiłbym ten sposób jeśli NULL jest przeznaczona do zwrotu wszystkich wierszy:

SET @query ='Select * FROM [A06].[Syn_RMDemand]' + 
      case when @Id is not null then 
      ' WHERE RMHierarchyId = ''' + @Id + '''' else '' end 

iw ten sposób, jeśli naprawdę chcesz mieć wiersze z warunku NULL:

SET @query ='Select * FROM [A06].[Syn_RMDemand] 
      WHERE RMHierarchyId ' + case when @Id is null 
      then 'is NULL' else '= ''' + @Id +'''' end 

ale potem znowu , zawsze lepiej unikać zapytania dynamicznego za wszelką cenę. Rozważmy:

Select * FROM [A06].[Syn_RMDemand] WHERE 
      (RMHierarchyId = @Id or nullif(@Id, '') is null) 

oraz:

Select * FROM [A06].[Syn_RMDemand] WHERE (RMHierarchyId = @Id or 
      (RMHierarchyId is null and @Id is null)) 
Powiązane problemy