存储过程EXEC vs sp_executesql的区别?
发布时间:2020-12-12 16:53:00 所属栏目:MsSql教程 来源:网络整理
导读:我已经用sp_executesql编写了两个存储过程,其他没有sp_executesql 两者都正在执行相同的结果,我没有得到什么区别 EXEC (@SQL) vs EXEC sp_executesql @SQL,N’@eStatus varchar(12)’, @eStatus = @Status 和EXEC(@SQL)如何易于SQL注入和sp_executesql @SQL
我已经用sp_executesql编写了两个存储过程,其他没有sp_executesql
两者都正在执行相同的结果,我没有得到什么区别
和EXEC(@SQL)如何易于SQL注入和sp_executesql @SQL ……不是? 没有sp_executesql的存储过程下面 ALTER proc USP_GetEmpByStatus ( @Status varchar(12) ) AS BEGIN DECLARE @TableName AS sysname = 'Employee' Declare @Columns as sysname = '*' DECLARE @SQL as nvarchar(128) = 'select ' + @Columns + ' from ' + @TableName + ' where Status=' + char(39) + @Status + char(39) print (@SQL) EXEC (@SQL) END EXEC USP_GetEmpByStatus 'Active' 以下存储过程与sp_executesql create proc USP_GetEmpByStatusWithSpExcute ( @Status varchar(12) ) AS BEGIN DECLARE @TableName AS sysname = 'JProCo.dbo.Employee' Declare @Columns as sysname = '*' DECLARE @SQL as nvarchar(128) = 'select ' + @Columns + ' from ' + @TableName + ' where Status=' + char(39) + @Status + char(39) print @SQL exec sp_executesql @SQL,N'@eStatus varchar(12)',@eStatus = @Status END EXEC USP_GetEmpByStatusWithSpExcute 'Active' 解决方法你的sp_executesql SQL应该是;DECLARE @SQL as nvarchar(128) = 'select ' + @Columns + ' from ' + @TableName + ' where Status=@eStatus' 这将允许您使用@eStatus作为参数调用sp_executesql,而不是将其嵌入到SQL中.这将有利于@eStatus可以包含任何字符,如果需要安全,它将被数据库自动正确地转义. 对应于EXEC所需的SQL; DECLARE @SQL as nvarchar(128) = 'select ' + @Columns + ' from ' + @TableName + ' where Status=' + char(39) + @Status + char(39) …嵌入@Status中的char(39)将使您的SQL无效,并可能创建SQL注入的可能性.例如,如果@Status设置为O’Reilly,则生成的SQL将为; select acol,bcol,ccol FROM myTable WHERE Status='O'Reilly' (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- sql-server-2008 – 如何在sql server中的波斯语中转换date
- reporting-services – 无法在SSRS 2008 R2订阅中选择多值参
- 在Linux系统安装Mysql教程
- SqlServer 数据库镜像 随笔
- sql-server-2005 – 我可以限制SQL Server 2005使用的CPU数
- Mysql数据库编码问题 (修改数据库,表,字段编码为utf8)
- 从数据库中查找视觉上相似的照片的算法?
- SQL SERVER基础:操作与命令大全
- SqlServer中decimal(numeric )、float 和 real 数据类型的区
- Cassandra用于无模式数据库,每天有数百万个订单表和数百万个