2016-10-07 4 views
4

Ich habe einen MSSQL Stored Procedure wie folgt:gespeicherte Prozedur gibt einen Fehler

ALTER procedure [dbo].[GetDataFromTable] 
(
@rowval varchar(50), 
@tablename varchar(50), 
@oby varchar(50) 
) 
as 
begin 
EXEC('Select top (' + @rowval + ') * from '[email protected]+ 'ORDER BY '[email protected]+' DESC') 
end 

Bei der Ausführung gibt es folgende Fehlermeldung: Msg 156, Ebene 15, Status 1, Zeile 1 Falsche Syntax nahe dem Schlüsselwort 'DURCH'. Ich versuchte auch folgende, immer noch die gleichen Fehler:

ALTER procedure [dbo].[GetDataFromTable] 
(
@rowval varchar(50), 
@tablename varchar(50), 
@oby varchar(50) 
) 
as 
begin 
EXEC('Select top (' + @rowval + ') * from '[email protected]+ 'ORDER BY sno DESC') 
end 

Hinweis: @rowval Anzahl der Zeilen darstellt geholt werden, stellt @tablename Name der Tabelle stellt @oby Spalte basierend auf welcher Reihenfolge getan werden sollte. Hinweis: Ich bin mit ASP.Net mit C# im Frontend dieses Verfahren zu schießen und mit MSSQL 2008 R2 Express Edition im Backend

Antwort

6

etwas Raum geben nach@tablename und vorORDER

Declare @sql varchar(max)='' 

SET @sql = 'Select top (' + @rowval + ') * from '+quotename(@tablename)+ ' ORDER BY sno DESC' 
                     --^here 
EXEC (@sql) 

Beginnen Sie auch mit Print/Select zu debuggen dynamic sql

Um etwas Sicherheit zu diesem dynamischen SQL hinzuzufügen, werde ich die folgenden Änderungen vornehmen

  1. Machen Sie den @rowval als INT
  2. Verwenden QUOTENAME Funktion in @tablename Parameter SQL-Injection
  3. zu vermeiden SP_EXECUTESQL verwenden, um die dynamische Abfrage statt EXEC

Hier auszuführen ist eine richtige Art und Weise zu tun Sie es

Declare @sql nvarchar(max)='',@tablename varchar(130), @rowval int 

select @sql = 'Select top (@rowval) * from '+quotename(@tablename)+ ' ORDER BY sno DESC' 

exec sp_executesql @sql,N'@rowval int',@rowval = @rowval 
+0

OOPS, So dumm von mir. Danke vielmals. – ITSagar

+0

@ITSagar - Wir machen alle Fehler –

+0

Danke, aber wohin Quoename und wie? Ich habe versucht, aber bekam Fehler – ITSagar

Verwandte Themen