2010-12-14 16 views
0

J'ai ce proc:SQL dynamique - quelque chose avec la clause where

Create PROCEDURE [dbo].[myProc] 
@TableName nvarchar(100), 
@RowID int 

AS 
BEGIN 
    SET @SQLQuery = 'Select * from ' + @TableName + ' where ID = ' + @RowID ; 
    EXECUTE(@SQLQuery); 
END 

Je veux essentiellement retourner la ligne résultant de cela, sans clause where, son tout bon.

+1

Cela vous convient pour ce que vous voulez faire (quelle que soit la vulnérabilité de SQL Injection). Qu'est-ce qui ne fonctionne pas? – Oded

+0

Si je supprime la clause where, j'obtiens des résultats. Mais avec la clause where de I get: La conversion a échoué lors de la conversion de la valeur nvarchar 'Select * from [TableName] où ID =' en type de données int. –

+0

Ajouter une impression @SQLQuery et vous pouvez exécuter la requête générée et vérifier si elle retourne des lignes –

Répondre

2

Vous devez être très prudent que vous avez-vous ouvert à des attaques par injection SQL. Je recommande fortement d'être très défensif et de paramétrer autant que possible. par exemple.

Create PROCEDURE [dbo].[myProc] 
@TableName nvarchar(100), 
@RowID int 
AS 
BEGIN 
    DECLARE @SQLQuery NVARCHAR(500); 
    IF (OBJECT_ID(@TableName) IS NOT NULL) 
     BEGIN 
      SET @SQLQuery = 'Select * from ' + QUOTENAME(@TableName) + ' where ID = @RowId' 
      EXECUTE sp_executesql @SQLQuery, N'@RowId INTEGER', @RowID 
     END 
END 

Il serait également utile d'envisager « verrouiller » quelles valeurs @TableName sont explicitement prises en charge - vérifier contre un whitelist avant de construire/exécuter le SQL dynamique.

+1

Merci Ada, fonctionne comme un charme, j'ai décidé de le faire à votre façon pour empêcher l'injection SQL. –

0

dans le cas où ID est d'essayer varchar ceci:

Create PROCEDURE [dbo].[myProc] 
@TableName nvarchar(100), 
@RowID int 

AS 
BEGIN 
    SET @SQLQuery = 'Select * from ' + @TableName + ' where ID = ''' + rtrim(ltrim(str(@RowID))) + ''''; 
    EXECUTE(@SQLQuery); 
END