2015-06-24 20 views
8

Sto eseguendo una query SQL dinamica. dove i parametri vengono passati dinamicamente. Ho scritto per la prima volta in modo simile al seguente codice.Passa il parametro del valore Null alla query SQL dinamica. Come può essere eseguito con successo?

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

Poi ho scritto questo.

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

Questo codice volta eseguito con successo. Poiché il parametro può essere vuoto, è necessario convertirlo in null. Ho modificato il codice e scritto questo

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

Nessun errore. La query si è interrotta.
Qualcuno ha questo tipo di problema?

+2

[ricerca condizioni dinamiche in T-SQL] (http://www.sommarskog.se/dyn-search.html) da Erland Sommarskog sarebbe una buona leggi per te, penso. –

+1

provare questo SET @ query = 'Seleziona * FROM [A06]. [Syn_RMDemand] DOVE RMHierarchyId =' '' + isnull (Convertire (VARCHAR, @id), '') + '''' EXEC (@ query) –

+0

Grazie a @ArunprasanthKV .. che funziona. –

risposta

1

Non c'è bisogno di convertirlo in NULL basta controllare con il vostro valore

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

provare quanto segue:

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

Se il parametro viene da cliente è meglio fare con la domanda parametrizzata (vedi @ risposta di ughai) al fine di escludere la possibilità sql injection ...

+0

@Giogi Nakeuri. Grazie. Questo ha dato il risultato. Ma ho una domanda. cosa succede se abbiamo più parametri come questo. devo controllare ogni parametro al valore nullo? –

+1

Si consiglia di utilizzare 'sp_executesql' con i parametri anziché la concatenazione delle stringhe – ughai

1

Prova questa.

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

Stesso risultato. Nessuna uscita –

+0

@ArunprasanthKV Non funziona. Cos'è questa sintassi '(at) query'? –

3

È necessario utilizzare sp_executeSQL e rimuovere la concatenazione di stringhe come questa. Suppongo che se si passa a NULL, si desidera che vengano restituite tutte le righe.

Query

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

Grazie. anche questo ha dato il risultato. –

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 

Si dovrebbe utilizzare query con parametri quando si utilizza SQL dinamico per evitare SQL Injection. Leggi this per ulteriori informazioni.

Se si desidera restituire tutte le righe se il numero @Id superato è NULL, è sufficiente rimuovere la parte ELSE.

+0

uno dei valori validi è ''RMH_108''. '@ Param' dovrebbe essere' VARCHAR'/'NVARCHAR' invece di' @param_id integer' – ughai

+0

@ughai, grazie per averlo capito. –

0

Sono curioso perché nessuno suggerendo non v'è alcuna necessità di utilizzare SQL dinamico qui

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

provare questo

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

    EXEC (@query) 
2

Qualsiasi cosa con l'aritmetica di NULL restituirà NULL.

farei questo modo se NULL è pensato per la restituzione di tutte le righe:

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

e in questo modo, se davvero vuole avere righe con condizione NULL:

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

Ma poi di nuovo , sarebbe sempre meglio evitare query dinamiche a tutti i costi. Considerate:

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

E:

Select * FROM [A06].[Syn_RMDemand] WHERE (RMHierarchyId = @Id or 
      (RMHierarchyId is null and @Id is null)) 
Problemi correlati