2017-04-24 3 views
0
CREATE PROCEDURE ProcedureName1 
    @columnsname varchar(50), 
    @columnsvalue varchar(50) 
AS 
BEGIN 
    with cet as 
    ( 
     Select ID, 
       names, 
       Null As address, 
       work, 
       note 
     From Tabl1 
     Where @columnsname Like @columnsvalue 
     Union All 
     Select t2.ID, 
       t2.name, 
       t2.address, 
       Null, 
       Null As tt 
     From Tabl2 As t2 
     Left Join Tabl1 As t1 
       On t2.ID = t1.ID 
     Where @columnsname Like @columnsvalue 
    ) 
    Select * 
    From cet 
    Order By id, 
      note Desc, 
      cet.address 
END GO 
+2

나는 * 당신이 실제로 그런 당신의 프로 시저를 작성하지 않았 으면 정말 *. 읽을 수없는 혼란입니다. 그 메모에, 당신은 질문을 잊어 버렸습니다. – Siyual

+1

임의의 열을 값과 비교하여 무작위로 검사하려고한다고 가정 할 때 동적 SQL 없이는이 작업을 수행 할 수 없습니다. 그리고 동적 SQL을 사용하는 것은 SQL 인젝션을 많이하는 경향이 있습니다. –

+0

1) 열과 테이블 이름은 "sysname"유형입니다. 2) 열 이름이나 테이블 이름이 필요한 곳에 변수를 전달할 수 없습니다. 3) 이와 같은 것을 정말로 필요로한다면 동적 SQL이 유일한 방법입니다. 4) 아마도 이런 식으로 시도해서는 안됩니다 ... 뒤로 물러서서 요구 사항을 다시 검토하십시오. 이것은 좋은 생각이 아닙니다. 나쁜 성능, 심각하게 보안 취약성. – pmbAustin

답변

0

이와 같이하려면 동적 SQL을 사용해야합니다. @columnsname의 값을 sys.columns 또는 information_schema.columns과 마찬가지로 허용하는 것이 좋습니다.

sp_executesql을 사용하여 매개 변수로 @columnsvalue을 계속 유지하고 실행중인 SQL에 연결하지 마십시오.

create procedure ProcedureName1 (
    @columnsname sysname --varchar(50) 
, @columnsvalue varchar(50) 
) as 
begin 
declare @sql nvarchar(max), @column_name sysname; 
/* make sure the @columnsname is a valid column name */ 
set @column_name = (
    select c.name 
    from sys.columns c 
    where c.object_id = object_id(N'Tabl1') 
    and c.name = @columnsname 
); 
set @sql = 'with cte as (
    select 
     ID 
     , names 
     , null as address 
     , work 
     , note 
    from Tabl1 
    where '[email protected]_name+' like @columnsvalue 
    union all 
    select 
     t2.ID 
     , t2.name 
     , t2.address 
     , null 
     , null as tt 
    from Tabl2 as t2 
    left join Tabl1 as t1 on t2.ID = t1.ID 
    where '[email protected]_name+' like @columnsvalue 
    ) 
    select * 
    from cet 
    order by 
     id 
    , note desc 
    , address;' 
exec sp_executesql @sql, N'@columnsvalue varchar(50)', @columnsvalue 
end; 
go 

참조 :

+0

대단히 감사합니다 SqlZim –

+0

@SrajMuneer 도와 드리겠습니다! 참조 자료를 읽고 동적 SQL에주의하십시오. – SqlZim

관련 문제