2017-02-05 2 views
0

Was ist falsch an meinem Code? Ich möchte die Select-Anweisung und die Where-Klausel Variablenwerte übergeben:Wie Übergeben der SELECT-Anweisung als Parameter an gespeicherte Prozedur in SQL Server?

ALTER PROC sp_ac_getItemLookupCode 
    @itemlookupcode varchar(20) = null, 
    @select varchar(30) 
AS 
BEGIN 
    SELECT DISTINCTT 
     @select 
    FROM 
     [ReportHQMatajer].[dbo].[JFC_ItemDailySalesParent] pp 
    WHERE 
     ItemLookupCode LIKE @itemlookupcode+'%' 
END 

Oben ist meine gespeicherte Prozedur. Ich führen Sie den folgenden Code, aber es gibt die Spalte Name nur

sp_ac_getItemLookupCode @select='ItemLookupCode',@itemlookupcode=1 

Es ist nicht alle Werte zurück. Es gibt den Spaltennamen als Ergebnis

+1

Forschung "dynamische SQL" –

+1

Randnotiz: Sie sollten ** nicht ** das Präfix 'sp_' für Ihre gespeicherten Prozeduren verwenden. Microsoft hat [dieses Präfix für seine eigene Verwendung reserviert (siehe * Gespeicherte Prozeduren benennen *)] (http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx), und Sie riskieren irgendwann in der Zukunft einen Namenskonflikt. [Es ist auch schlecht für die Leistung Ihrer gespeicherten Prozedur] (http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix). Es ist am besten, einfach 'sp_' zu vermeiden und etwas anderes als Präfix zu verwenden - oder gar kein Präfix! –

Antwort

0

Verwenden der dynamische Abfrage über Verwendung SP_EXECUTESQL System gespeichert proecures als nächstes: -

ALTER PROC sp_ac_getItemLookupCode 
@itemlookupcode varchar(20)= null, 
@select varchar(30) 
AS 
BEGIN 
declare @Query nvarchar(2000) 
set @Query = 
    'select distinct ' + @select + ' 
    FROM 
     [ReportHQMatajer].[dbo].[JFC_ItemDailySalesParent] pp 
    WHERE 
     ItemLookupCode like ''' + @itemlookupcode+ + '%'' ' 
exec sp_executesql @Query 
END 
+0

wird es Sql-Injektion verursachen? –

+0

Falsche Syntax in der Nähe von% –

+0

@Abbas Die Antwort wurde bearbeitet, versuchen Sie es erneut. –

-1

Wenn Sie Spaltennamen übergeben mögen (oder Tabellennamen oder Funktionsnamen oder dergleichen), Sie dynamischen SQL verwenden müssen:

ALTER PROC sp_ac_getItemLookupCode (
    @itemlookupcode varchar(20) = null, 
    @select varchar(30) 
) AS 
BEGIN 
    declare @sql = nvarchar(max); 

    set @sql = ' 
select distinct @select 
from [ReportHQMatajer].[dbo].[JFC_ItemDailySalesParent] pp 
'; 

    set @sql = replace(@sql, '@select', @select); 

    if (@itemlookupcode is not null) 
    begin 
     set @sql = @sql + 'where ItemLookupCode like ''' + @itemlookupcode + '%''' 
    end; 

    exec sp_executesql @sql; 
END; 

Ich fügte hinzu, die Funktionalität, wenn @itemlookupcode ist NULL, dann gibt es alle Zeilen zurück.

+0

Fehler auf Ihrem Code –

+0

Welche Art von Fehler. Und warum der Downvote? –

0

Wenn Sie Spaltennamen als Parameter übergeben wollen, dann müssen Sie Ihre dynamische Abfrage, als nächstes machen: -

Exec ('select distinct '[email protected]+' 
    FROM 
     [ReportHQMatajer].[dbo].[JFC_ItemDailySalesParent] pp') 
Verwandte Themen