Ich habe versucht, eine gespeicherte Prozedur zu aktualisieren, die ohne die Verwendung von sp_executesql funktionierte. Ich möchte jetzt den Tabellennamen als Parameter haben, da ich mehrere Tabellen mit der gleichen Struktur habe und nicht für jede von ihnen neue gespeicherte Prozeduren erstellen möchte.Gespeicherte Prozedur mit Tabellenname als Parameter
Das Problem, das ich habe, ist, dass diese Version alle Parameter erfordert, während die vorherige eine beliebige Anzahl von Parametern akzeptiert hat. Zum Beispiel, wenn ich alle WHERE-Parameter entfernen und nur den Parameter @TableName haben, funktioniert es gut. Ich habe versucht, nach einem Beispiel zu suchen, aber ich kann nichts dergleichen finden. Alle Beispiele zum Analysieren des Tabellennamens haben nur diesen Parameter.
CREATE PROCEDURE cafgTenantNamesTEST2
@TableName sysname,
@Square nvarchar(100) = null,
@Location nvarchar(100) = null,
@Name nvarchar(100) = null,
@NormalizedName nvarchar(100) = null,
@SharedLand int = 0,
@FieldNumber int = 0,
@Description nvarchar(255) = null,
@Dwelling nvarchar(100) = null
AS
BEGIN
DECLARE @sql AS NVARCHAR(MAX)
SET @sql = 'SELECT * FROM [' + @TableName + ']' +
'WHERE ([Square] LIKE ''' + @Square + ''' OR ''' + @Square + ''' IS NULL)' +
'AND ([Location] = ''' + @Location + ''' OR ''' + @Location + ''' IS NULL)' +
...
...
--PRINT @sql
EXEC sp_executesql @sql
END
Vorschläge bitte.
Überprüfen Sie den Wert von @sql und stellen Sie sicher, dass es ausgeführt werden kann. Können Sie eine SQL-Zeichenfolge erstellen, indem Sie den Tabellennamen fest codieren und die WHERE-Klausel verwenden? – JeffO
Versuchen Sie, ein Leerzeichen vor dem 'WHERE' und dem' AND', das Sie verketten, ohne Leerzeichen hinzuzufügen. – HABO