BOM 구조를 구현하려고 하는데요.
가져온 리스트하고 다른 테이블하고 조인해서 사용하고 싶은데 도무지 방법이 떠오르지 않네요.
카테고리를 쓰는 테이블이 여러개라서 동적으로 구현하려고 하는데 잘안되네요.
고수님들 답변 부탁드립니다.
감사합니다.
시도방법 1
프로시저 생성.
CREATE PROCEDURE [dbo].[SP_BOM]
(@tblName varchar(100), @idx varchar(100), @pidx varchar(100), @name varchar(100), @whereIdx varchar(100))
WITH
EXECUTE AS CALLER
AS
declare @sql nvarchar(4000)
declare @sqlwhere nvarchar(4000)
set @sqlwhere = ''
if @whereIdx > 0
begin
set @sqlwhere = 'and '+@idx+'=' + @whereIdx
end
set @sql = N'
With CTE(ridx, rname, rpidx, rlevel, rsortcol)
As (
-- C1
Select '+@idx+' as ridx, '+@name+' as rname, '+@pidx+' as rpidx, 1 As rlevel, CAST('+@idx+' AS VARBINARY(900)) as rsortcol
From '+@tblName+'
Where ('+@pidx+' is null or '+@pidx+'=0) '+@sqlwhere+'
Union all
-- M2
Select C.'+@idx+' as ridx, C.'+@name+' as rname, C.'+@pidx+' as rpidx, CC.rlevel + 1, CAST(rsortcol + CAST(C.'+@idx+' AS BINARY(4)) AS VARBINARY(900)) as rsortcol
From '+@tblName+' C inner join CTE CC
On C.'+@pidx+' = CC.ridx
)
Select * From CTE order by rsortcol;
'
select * from (execute sp_bom '테이블', ' -> 에러..
시도방법 2
함수 생성.
ALTER function [dbo].[FN_BOM](
@tblName varchar(100),
@idx varchar(100),
@pidx varchar(100),
@name varchar(100),
@whereIdx int
)
RETURNS @returnTABLE TABLE(
ridx int,
rname varchar(100),
rpidx int,
rlevel int,
rsortcol binary(900)
)
AS
BEGIN
declare @sql nvarchar(4000)
INSERT INTO @returnTABLE execute sp_bom 'stock_category', 'stc_idx', 'stc_pidx', 'stc_name', '0';
RETURN;
프로시저를 참조하여 table 형식으로 리턴 -> 에러
파생작업을 생성하거나 시간에 종속적인 연산자를 잘못사용했다고 나옴.
시도방법3
커서를 만들어서 프로시저 참조.
declare @ridx int
declare @rname varchar(100)
declare @rpidx int
declare @rlevel int
declare @rsortcol binary(900)
declare @strSql varchar(1000)
DECLARE cursor_bom CURSOR FOR
sp_bom 'stock_category', 'stc_idx', 'stc_pidx', 'stc_name', '0';
OPEN cursor_bom
FETCH NEXT FROM cursor_bom INTO @ridx, @rname, @rpidx, @rlevel, @rsortcol
WHILE(@@FETCH_STATUS = 0 )
BEGIN
select @ridx, @rname, @rpidx, @rlevel, @rsortcol
FETCH NEXT FROM cursor_bom INTO @ridx, @rname, @rpidx, @rlevel, @rsortcol
END
CLOSE cursor_bom
에러
select 구문이 아니면 안되는듯..