存储过程中可以以数据集座位参数吗?

wubaozhang 2009-04-24 12:04:14
问题是这样的,开发人员希望以存储过程实现分页,提供了一个网络上找的存储过程代码:


--分页用存储过程
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
/*
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
*/

ALTER PROCEDURE [dbo].[PagingRecord]
(
@PageIndex int,--页号,从0开始
@PageSize int,--页尺寸
@OrderField varchar(100),--排序字段及类型(多个条件用逗号分开)如:JobID DESC,Checkintime
@TableName varchar(100),--表名或视图表
@StrWhere varchar(2000),--条件
@FieldList varchar(2000),--欲选择字段列表
@DoCount AS bit=1-- 0值返回记录总数, 非 0 值则返回记录
)
AS

BEGIN TRAN

DECLARE @SqlQuery varchar(4000)

IF @DoCount<>0
Goto GetCount
Else
Goto GetSearch



GetCount:--返回记录总数
DECLARE @SearchSql AS Nvarchar(4000)
SET @SearchSql= 'SELECT Count(*) AS Total FROM '+@TableName+' WHERE '+@StrWhere
exec sp_executesql @SearchSql
--print @SearchSql
COMMIT TRAN
return

GetSearch:

SET @SqlQuery='SELECT '+@FieldList+'
FROM (SELECT row_number() over(ORDER BY '+@OrderField+') as rownum,
'+@FieldList+'
FROM '+@TableName+' WHERE '+@StrWhere +') as temp
WHERE rownum BETWEEN ('+cast(@PageIndex as varchar)+'-1)*'+cast(@PageSize as varchar)+'+1 and '+cast(@PageIndex as varchar)+'*'+cast(@PageSize as varchar) + ' ORDER BY '+@OrderField
--print @SqlQuery
SET NOCOUNT ON
execute(@SqlQuery)
SET NOCOUNT OFF


COMMIT TRAN


分析代码后我认为是相当于拼写SQL进行查询,像输入StrWhere 这种代码肯定是不合适的,不符合三层架构的原理,所以我希望实现存储过程中的输入为一个数据集(为实现通用存储过程,所以不能用SQL语句写死,为实现代码安全也不能传递SQL执行)
所以请问各位,存储过程的传递参数能够使用数据集(SQL语句的查询结果)作为输入参数吗?能的话怎么实现?不能的话有什么替代的方式
...全文
199 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
wubaozhang 2009-04-28
  • 打赏
  • 举报
回复

无人关注 平均给分吧
wubaozhang 2009-04-27
  • 打赏
  • 举报
回复
不管什么方式和建议,最好都有个例子啊
net_steven 2009-04-25
  • 打赏
  • 举报
回复
传XML,在SP中用OpenXml()再解析为临时表. 传入的数据量不宜过大,会有效率问题.
wubaozhang 2009-04-24
  • 打赏
  • 举报
回复
我是打算存到临时表传递的,这跟数据集的概念不同啊,不了解专有名词

我想问的就是怎么样把查询的临时表当单数传递,总不能专门建立一个表当做临时表存储数据然后存储过程直接访问固定的表吧
jia_guijun 2009-04-24
  • 打赏
  • 举报
回复
先把数据集添加到临时表中,然后在存储过程中调用那个临时表就行了。
Brotter 2009-04-24
  • 打赏
  • 举报
回复
StrWhere 用与工厂模式的开发不错. sql里面好象不能使用数据集,select的结果当参数传入比较好,支持楼上的说法,
希望对你有帮助, 来拿点分!呵呵
sdhdy 2009-04-24
  • 打赏
  • 举报
回复
可以用临时表试一下,不过感觉没有必要,三层架构反而搞得很麻烦。
sdhdy 2009-04-24
  • 打赏
  • 举报
回复
至少SQL2000是不能使用数据集(SQL语句的查询结果)作为输入参数。

不过楼主的意思我还是不太明白,StrWhere 这种代码肯定是不合适的,不符合三层架构的原理

传入数据集(SQL语句的查询结果)作为输入参数,就符合了?
  • 打赏
  • 举报
回复
可以先把数据集放到一个临时表中。这样好处理一点
-晴天 2009-04-24
  • 打赏
  • 举报
回复
或用临时表.
-晴天 2009-04-24
  • 打赏
  • 举报
回复
用表变量?
wubaozhang 2009-04-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 sdhdy 的回复:]
可以用临时表试一下,不过感觉没有必要,三层架构反而搞得很麻烦。
[/Quote]

其实我对三层架构的理解是
数据层(数据库包含表和存储过程及视图等)--中间层--界面层(代码层)
界面层不直接记录数据层对象名称,而是通过中间层得到名称,然后在界面层组合SQL语句执行的

但现在是对象编程思想了,搞不懂为什么他们的三层架构要把业务层的东西丢到数据层的存储过程。。。。
wubaozhang 2009-04-24
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 szx1999 的回复:]
要通用,就得用@strWhere;
要高效和安全,就得针对功能自己设参数,就不能通用。
两者不能兼得。

目前似乎不能用结果集做参数,即使有,效率也会不高。

安全性的问题,应该从页面层就开始考虑,比如过滤掉一些危险字符。
[/Quote]

如果说为了通用,那就不会考虑用存储过程实现了,在页面层实现翻页就更方便了

我本人也是不赞成用存储过程做这些事情,不过项目这么规定我也没办法啊。。
wubaozhang 2009-04-24
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 sue_1018 的回复:]
存储过程中无法用表的集合作为参数,但是你可以将数据放在临时表中,在存储过程中像操作表一样操作就成
[/Quote]

是不是能用标集合做参数正是这里探讨的重点
如果说是放在全局临时表给存储过程像表一样操作,那么在多用户调用同一个存储过程的时候就100%出问题,尤其在大量并发情况下尤其明显
如果放在会话临时表中,那么在同一个事务中就出问题了

还是我理解有偏差呢
等不到来世 2009-04-24
  • 打赏
  • 举报
回复
要通用,就得用@strWhere;
要高效和安全,就得针对功能自己设参数,就不能通用。
两者不能兼得。

目前似乎不能用结果集做参数,即使有,效率也会不高。

安全性的问题,应该从页面层就开始考虑,比如过滤掉一些危险字符。
sue_1018 2009-04-24
  • 打赏
  • 举报
回复
存储过程中无法用表的集合作为参数,但是你可以将数据放在临时表中,在存储过程中像操作表一样操作就成
wubaozhang 2009-04-24
  • 打赏
  • 举报
回复
集思广益啊,那位大大给个以临时表或数据集作为参数的存储过程的范例啊
duanzhi1984 2009-04-24
  • 打赏
  • 举报
回复
我的建议是你可将你的数据集的语句传递给存储过程,在存储过程中在执行运算!

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧