2016-06-16 13 views
0

Ich versuche, diese Abfrage auszuführen, indem es Fehler auslöst, wenn das heißtWarum wirft meine Abfrage einen falschen Syntaxfehler?

EXEC('Select Count(*) Total 
     from '[email protected]+' 
     where fk_Orgs_PropertyDetails_OrgID='+ 'Cast('[email protected]+' as varchar') 

Warum dieser Fehler ich laufen?

INCORRECT SYNTAX NEAR VARCHAR  

Hinweis: @TableName ist Varchar(100) und @OrgID ist int

+0

was ist der @OrgID Wert? –

+0

Es ist nur eine ID, die ich passiere. Sein Datentyp ist INT – Cuckoo

+3

Ich hoffe, dass 'fk_Orgs_PropertyDetails_OrgID'' int' ist? Wenn ja, warum nach Varchar werfen? –

Antwort

8

Sie eine schließende Klammer in Ihren Anruf CAST fehlt. Versuchen Sie folgendes:

EXEC('Select Count(*) AS Total from ' + @TableName + 
    ' where fk_Orgs_PropertyDetails_OrgID = Cast(' + @OrgID + ' as varchar)') 

Wie @Felix wies darauf hin, wenn Ihr fk_Orgs_PropertyDetails_OrgID Spalte ist bereits ein INT, dann gibt es keine Notwendigkeit zu werfen @OrgID-VARCHAR. Also einfach folgendes verwenden:

EXEC('Select Count(*) AS Total from ' + @TableName + 
    ' where fk_Orgs_PropertyDetails_OrgID = ' + @OrgID) 
+0

Ich würde stattdessen einen Vorschlag hinzufügen, 'sp_executesql' zu verwenden. –

2

In Ihrer Abfrage fehlt ")" zuletzt von CAST.

Wenn @OrgID definiert ist varchar und fk_Orgs_PropertyDetails_OrgID ist int, dann müssen Sie nicht CAST verwenden. Execute

EXEC('Select Count(*) Total 
from '[email protected]+' 
where fk_Orgs_PropertyDetails_OrgID='[email protected]) 

Nach Wenn die Spalte fk_Orgs_PropertyDetails_OrgID varchar-Typ ist. Führen Nach

EXEC('Select Count(*) Total 
from '[email protected]+' 
where fk_Orgs_PropertyDetails_OrgID='''[email protected]+'''') 

Dank

0

Sie vermissen schließenden Klammer

EXEC('Select Count(*) Total from '+ @TableName + ' where fk_Orgs_PropertyDetails_OrgID=' + 'Cast('+ @OrgID + ' as varchar)') 
4

Wie andere beantwortet haben, vergessen Sie eine ) nach dem VARCHAR:

EXEC('Select Count(*) Total 
     from '[email protected]+' 
     where fk_Orgs_PropertyDetails_OrgID='+ 'Cast('[email protected]+' as varchar)'); 

jedoch schlage ich vor, nicht mit EXEC. Stattdessen sollten Sie sp_executesql verwenden. Dies hat den zusätzlichen Vorteil, dass mehr Sicherheit geboten wird, indem SQL Injection verhindert wird.

DECLARE @TableName VARCHAR(100), 
     @OrgID  INT; 

DECLARE @sql NVARCHAR(MAX); 

SET @sql = 
'SELECT COUNT(*) Total 
FROM ' + QUOTENAME(@TableName) + ' 
WHERE fk_Orgs_PropertyDetails_OrgID = @OrgID'; 

EXEC sp_executesql 
    @sql, 
    N'@OrgID INT', 
    @OrgID 
; 

Die oben davon ausgeht, dass ein fk_Orgs_PropertyDetails_OrgIDINT ist.

Weitere auf dynamische SQL-Lesen:

+0

Wenn 'fk_Orgs_PropertyDetails_OrgID' bereits ein' INT' ist, dann benutze 'fk_Orgs_PropertyDetails_OrgID = @ OrgId' direkt und fertig damit? –

+0

@TimBiegeleisen Was meinst du?Genau das habe ich in meiner 'sp_executesql' Lösung gemacht. –

+0

Ja, aber in diesem Fall sollte der ursprüngliche Aufruf von 'EXEC' auch funktionieren, oder? –

Verwandte Themen