【发布时间】:2016-04-25 06:54:29
【问题描述】:
我需要将查询作为存储过程存储在 SQL Server 中。
我还需要传递定义表名和列名的参数。
这是我想要的查询,我尝试将它存储在一个字符串中,然后EXECUTE 它但没有成功,我能解决这个问题吗?
CREATE PROCEDURE sp_selectAllParents @id int, @tableid varchar(30), @tablename varchar(30)
AS BEGIN
SET NOCOUNT ON;
WITH ct AS (
SELECT * FROM @tablename t WHERE @tableid = @id
UNION ALL
SELECT t.* FROM @tablename t JOIN ct ON t.parentId = ct.@tableid
)
SELECT * FROM @tablename t WHERE @tableid NOT IN (SELECT @tableid FROM ct)
END
编辑: 我的尝试是:
DECLARE @sql varchar(255)
SET @sql = 'WITH ct AS (SELECT * FROM @tablename t WHERE @tableid = @id UNION ALL SELECT t.* FROM @tablename t JOIN ct ON t.parentId = ct.@tableid) SELECT * FROM @tablename t WHERE @tableid NOT IN (SELECT @tableid FROM ct)'
EXEC(@sql)
【问题讨论】:
-
你能展示一下你的尝试吗?
-
您真的有这么多具有层次结构的不同表,因此需要一个通用过程吗?这充满了问题,我原以为只为每个表编写一个过程会更安全、更简单,而且更不容易出错(提供的表或列名无效)。在不相关的注释上,您应该avoid the prefex
sp_for your own procedures。 -
构建以表名和/或列名作为参数以从中获取结果的存储过程通常是一个坏主意。你应该重新考虑你的解决方案。
-
我知道这不是一个好习惯,但我正在修复一个旧项目,我只能在不修改现有架构的情况下这样做
标签: sql-server stored-procedures with-statement dynamicquery