2017-04-24 9 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

関連する問題