2010-03-30 8 views
1

J'ai une fonction MS SQL qui est appelée avec la syntaxe suivante:Comment appeler la fonction SQL avec plusieurs paramètres de C# page web

SELECT Field1, COUNT(*) AS RecordCount 
FROM GetDecileTable('WHERE ClientID = 7 AND LocationName = ''Default'' ', 10) 

Le premier paramètre passe une clause WHERE spécifique qui est utilisé par la fonction pour l'une des requêtes internes. Quand j'appelle cette fonction dans la page C# front-end, je dois envoyer des valeurs de paramètres pour les champs individuels à l'intérieur de la clause WHERE (dans cet exemple, les ClientID & LocationName champs)

Le code actuel C# ressemble ceci:

String SQLText = "SELECT Field1, COUNT(*) AS RecordCount FROM GetDecileTable('WHERE 
        ClientID = @ClientID AND LocationName = @LocationName ',10)"; 
SqlCommand Cmd = new SqlCommand(SQLText, SqlConnection); 
Cmd.Parameters.Add("@ClientID", SqlDbType.Int).Value = 7; // Insert real ClientID 
Cmd.Parameters.Add("@LocationName", SqlDbType.NVarChar(20)).Value = "Default"; 
       // Real code uses Location Name from user input 
SqlDataReader reader = Cmd.ExecuteReader(); 

Quand je fais cela, je reçois le code suivant de SQL profileur:

exec sp_executesql N'SELECT Field1, COUNT(*) as RecordCount FROM GetDecileTable 
(''WHERE ClientID = @ClientID AND LocationName = @LocationName '',10)', 
N'@ClientID int,@LocationID nvarchar(20)', 
@ClientID=7,@LocationName=N'Default' 

Lorsque cette exécute, SQL renvoie une erreur qu'il ne peut pas analyser passé le premier mention de @ClientID indiquant que la variable scalaire @ClientID doit être définie. Si je modifie le code pour déclarer les variables en premier (voir ci-dessous), alors je reçois une erreur à la deuxième mention de @ClientID que la variable existe déjà.

exec sp_executesql N'DECLARE @ClientID int; DECLARE @LocationName nvarchar(20); 
SELECT Field1, COUNT(*) as RecordCount FROM GetDecileTable 
(''WHERE ClientID = @ClientID AND LocationName = @LocationName '',10)', 
N'@ClientID int,@LocationName nvarchar(20)', 
@ClientID=7,@LocationName=N'Default' 

Je sais que cette méthode d'ajout de paramètres et d'appeler le code SQL de C# fonctionne bien quand je suis la sélection des données à partir de tables, mais je ne suis pas sûr de savoir comment intégrer les paramètres à l'intérieur des «marques de devis pour la intégré WHERE clause étant passée à la fonction.

Des idées?

Répondre

1

était

SELECT Field1, COUNT(*) AS RecordCount FROM GetDecileTable('WHERE 
ClientID = @ClientID AND LocationName = @LocationName ',10) 

devrait

SELECT Field1, COUNT(*) AS RecordCount FROM GetDecileTable('WHERE 
ClientID = ' + @ClientID + ' AND LocationName = ' + @LocationName,10) 

vos variables sont utilisées dans la chaîne où ils sont considérés comme partie.

+0

Merci, mais cela ne correspond pas à la facture dans cette situation. Le problème vient à cause des guillemets intégrés dans la clause sub-WHERE. – Marshall