【发布时间】:2013-06-11 17:15:46
【问题描述】:
我尝试更新一个运行良好的存储过程,而无需使用 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
请提出建议。
【问题讨论】:
-
检查@sql 的值并确保它可以执行。你能通过硬编码表名来构建一个 sql 字符串并让 Where 子句起作用吗?
-
尝试在
WHERE和AND之前添加一个空格,你要连接的没有空格。
标签: sql-server stored-procedures dynamic-sql