使用动态sql的替代方法

xxy*_*yxx 7 sql t-sql stored-procedures

我有一个输入@featuretype的sp.@featuretype将等于"mobile","login"或"index",并且将对应于db中的列.

在我的sp我有:

EXEC(
    'select TOP 3 * from featuredtypes_v where'+' featuredtypes_v.'+@featuretype+'Page=1'+
    ' order by featuredtypes_v.priority desc'
    )
Run Code Online (Sandbox Code Playgroud)

但是,我被告知这会打开一个sql注入数据库.我的两个问题是,为什么会这样,以及如何编写此查询以避免这种情况呢?

Far*_*han 6

你为什么不用case

select TOP 3 * 
from featuredtypes_v F
where
    case
        when @featuretype = 'mobile' then F.MobilePage
        when @featuretype = 'login' then F.LoginPage
        when @featuretype = 'index' then F.IndexPage
    end
    = 1
Run Code Online (Sandbox Code Playgroud)