Мне нужно сохранить запрос как хранимую процедуру в SQL Server.Оператор WITH в динамическом sql
Мне также необходимо передать параметры, которые определяют имена таблиц и столбцов.
Это вопрос, который мне нравится, я попытался сохранить его в строке, а затем 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 = [email protected]
)
SELECT * FROM @tablename t WHERE @tableid NOT IN (SELECT @tableid FROM ct)
END
EDIT: моей попытка была:
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 = [email protected]) SELECT * FROM @tablename t WHERE @tableid NOT IN (SELECT @tableid FROM ct)'
EXEC(@sql)
Можете ли вы показать свою попытку? –
У вас действительно есть так много разных таблиц с иерархической структурой, что необходима общая процедура для этого? Это чревато проблемами, и я бы подумал, что просто написать процедуру для каждой таблицы будет более безопасной и простой, а также меньше подверженности ошибкам (указаны недопустимые имена таблиц или столбцов). На несвязанной ноте вы должны [избегать prefex 'sp_' для своих собственных процедур] (http://sqlperformance.com/2012/10/t-sql-queries/sp_prefix). – GarethD
Как правило, плохой идеей является создание хранимых процедур, которые принимают имя таблицы и/или имя столбца в качестве параметров для получения результатов. Вы должны пересмотреть свое решение. –