Procédure stockée avec le nom de la table comme un paramètre parmi d'autres

J'ai essayé de mettre à jour une procédure stockée qui a bien fonctionné, sans avoir à utiliser sp_executesql. Maintenant, je veux avoir le nom de la table comme un paramètre que j'ai un certain nombre de tables avec la même structure et ne souhaitez pas créer de nouvelles procédures stockées pour chacun d'eux.

Le problème que j'ai c'est que cette version semble exiger de tous les paramètres, alors que la précédente accepté un certain nombre de paramètres. Par exemple, si je supprime tous les paramètres et juste le paramètre @TableName il fonctionne très bien. J'ai essayé de regarder pour un exemple, mais je ne peux pas trouver quelque chose comme cela. Tous les exemples de l'analyse du nom de la table ont seulement ce paramètre.

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

Suggestions s'il vous plaît.

Vérifier la valeur de @sql et assurez-vous qu'il peut exécuter. Pouvez-vous construire une chaîne sql par coder en dur le nom de la table et obtenir la clause where de travail?
Essayez d'ajouter un espace avant le WHERE et la AND que vous concaténez sans les espaces.

OriginalL'auteur Peter C | 2013-06-15