sp_executesql を使用しなくても問題なく動作するストアド プロシージャを更新しようとしました。同じ構造のテーブルが多数あり、それぞれに新しいストアドプロシージャを作成したくないため、テーブル名をパラメーターとして使用したいと考えています。
私が抱えている問題は、このバージョンはすべてのパラメーターを必要とするように見えることですが、以前のものは任意の数のパラメーターを受け入れました。たとえば、すべての WHERE パラメーターを削除して @TableName パラメーターのみを指定すると、問題なく動作します。例を探してみましたが、このようなものは見つかりません。テーブル名を解析するすべての例には、そのパラメーターのみがあります。
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
提案してください。