- --如何支持动态拼接SQL的参数化查询
- --本demo主要演示,如何在拼接SQL语句的情况下参数化查询
- --建立测试表
- create table oswica_test_table_1
- (
- id int,
- name varchar(50),
- remark varchar(100)
- )
- go
- --写入部分测试数据
- insert into oswica_test_table_1 select 1,'oswica',''
- insert into oswica_test_table_1 select 2,'stone',''
- insert into oswica_test_table_1 select 3,'nana',''
- insert into oswica_test_table_1 select 4,'nana',''
- go
- --建立存储过程
- create proc oswica_proc_querytestdata
- (
- @whereSql nvarchar(max),
- @paramNameList nvarchar(max),
- @paramValueList nvarchar(max)
- )
- as
- begin
- declare @exesql nvarchar(max)
- --生成查询语句
- set @exesql='EXEC sp_executesql N''select * from oswica_test_table_1 '+@whereSql+''',N'''+@paramNameList+''','+@paramValueList+''
- print @exesql
- exec(@exesql)
- end
- go
- --执行存储过程
- exec oswica_proc_querytestdata N'where id=@id and name=@name',N'@id int,@name varchar(50)',N'@id=1,@name=''oswica'''
- go
- --结果
- --EXEC sp_executesql N'select * from oswica_test_table_1 where id=@id and name=@name',N'@id int,@name varchar(50)',@id=1,@name='oswica'
- --id name remark
- ----------- -------------------------------------------------- ----------------------------------------------------------------------------------------------------
- --1 oswica
- --说明
- --实际上我们不推荐直接在存储过程中这么使用。因为这里还是存在执行代码里面有拼接sql的情况。
- --最好的办法是在程序代码里面动态拼接好然后使用参数方式动态的根据实际参数个数传入参数,已
- --实现即能够兼容参数化查询又能够拼接字符串。
- --
- --建议
- --按照上面的说法,我们可以拼接如下sql:
- --select * from oswica_test_table_1 where id=@id and name=@name
- --然后按照拼接的参数个数使用SqlCommand 的Parameters 动态的添加2个参数:@id和@name来达到
- --目的。而在编程语言中实现动态添加参数相对比较容易,或者通过实现sql server的 CLR存储过程来
- --达到这一目的。
转载于:https://blog.51cto.com/oswica/466004