在sql server中建存储过程,如果需要参数是一个可变集合怎么处理?

在sql server中建存储过程,如果需要参数是一个可变集合的处理

原存储过程,@objectIds 为可变参数,比如 110,98,99

ALTER PROC [dbo].[Proc_totalScore]

@categoryKey int,

@objectIds VARCHAR(MAX)

AS

BEGIN

     SELECT c.Name,AVG(e.Score) Score FROM dbo.Sys_com_comment_main m

     INNER JOIN dbo.sys_com_coment_extend e ON e.commentId=m.ID

     INNER JOIN dbo.sys_com_category c ON e.NameKey=c.NameKey

     WHERE m.categoryKey=@categoryKey AND m.dataStatus<>99 AND m.IsCheck=0 AND m.objectId IN(@objectIds)

     GROUP BY c.Name

END

调用1:EXEC [Proc_totalScore] 99902,'110'

 

调用2:EXEC [Proc_totalScore] 99902,'110,97,87'

 

 

在sql server中建存储过程,如果需要参数是一个可变集合怎么处理?

上网搜了一下大部分都是酱油贴,有网友说用xml的方式,具体的代码也没看见

 

折中一下,用sql拼接来实现可变参数的效果 

先举个sql拼接的例子

DECLARE @sql NVARCHAR(MAX)

SET @sql ='select 1 mmd'

EXECUTE(@sql)

 

折中后的存储过程

ALTER PROC [dbo].[Proc_totalScore]

@categoryKey VARCHAR(100),

@objectIds VARCHAR(MAX)

AS

BEGIN

DECLARE @sql NVARCHAR(MAX)

SET @sql ='SELECT c.Name,AVG(e.Score) Score FROM dbo.Sys_com_comment_main m

         INNER JOIN dbo.sys_com_coment_extend e ON e.commentId=m.ID

         INNER JOIN dbo.sys_com_category c ON e.NameKey=c.NameKey

         WHERE m.categoryKey='+@categoryKey+' AND m.dataStatus<>99 AND m.IsCheck=0 AND m.objectId IN('+@objectIds+')

         GROUP BY c.Name'

         EXECUTE(@sql)

END

最终效果

时间: 2024-12-05 12:04:08

在sql server中建存储过程,如果需要参数是一个可变集合怎么处理?的相关文章

SQL Server中存储过程比直接运行SQL语句慢的原因

原文:SQL Server中存储过程比直接运行SQL语句慢的原因     在很多的资料中都描述说SQLSERVER的存储过程较普通的SQL语句有以下优点: 1.       存储过程只在创造时进行编译即可,以后每次执行存储过程都不需再重新编译,而我们通常使用的SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度. 2.       经常会遇到复杂的业务逻辑和对数据库的操作,这个时候就会用SP来封装数据库操作.当对数据库进行复杂操作时(如对多个表进行 Upd

sqlserver-如何获取SQL SERVER 2008 存储过程参数默认值

问题描述 如何获取SQL SERVER 2008 存储过程参数默认值 比如我的存储过程创建语句如下: CREATE PROC [dbo].[SearchBillDetail] ( @OpBeginDate DATETIME , @OpEndDate DATETIME , @BillTypeID INT , @BillOperType INT , @SaleOperID INT = 1, @DrCompID INT = NULL ) AS SET NOCOUNT ON -- 后面省略 这是我需要通

简单谈基于SQL SERVER 分页存储过程的演进

server|存储过程|分页 简单谈基于SQL SERVER 分页存储过程的演进 作者:郑佐日期:2006-9-30 针对数据库数据在UI界面上的分页是老生常谈的问题了,网上很容易找到各种"通用存储过程"代码,而且有些还定制查询条件,看上去使用很方便.笔者打算通过本文也来简单谈一下基于SQL SERVER 2000的分页存储过程,同时谈谈SQL SERVER 2005下分页存储过程的演进. 在进行基于UI显示的数据分页时,常见的数据提取方式主要有两种.第一种是从数据库提取所有数据然后在

在asp中调用sql server的存储过程

在asp中调用sql server的存储过程可以加快程序运行速度,所以这些天在研究asp中利用sql server的存储过程,现总结如下,其中很多思想也是直接从chinaasp论坛中得出来,希望能给大家一些帮助.1.调用存储过程的一般方法先假设在sql server中有一存储过程dt_users:CREATE PROCEDURE [dbo].[dt_users] ASselect * from usersreturnGO第一种方法是不利用command对象,直接用recordset对象set r

浅谈基于SQL Server分页存储过程五种方法及性能比较

在SQL Server数据库操作中,我们常常会用到存储过程对实现对查询的数据的分页处理,以方便浏览者的浏览. 创建数据库data_Test : create database data_Test GO use data_Test GO create table tb_TestTable --创建表 ( id int identity(1,1) primary key, userName nvarchar(20) not null, userPWD nvarchar(20) not null, u

五种SQL Server分页存储过程的方法及性能比较_MsSql

在SQL Server数据库操作中,我们常常会用到存储过程对实现对查询的数据的分页处理,以方便浏览者的浏览.本文我们总结了五种SQL Server分页存储过程的方法,并对其性能进行了比较,接下来就让我们来一起了解一下这一过程. 创建数据库data_Test : create database data_Test GO use data_Test GO create table tb_TestTable --创建表 ( id int identity(1,1) primary key, userN

SQL SERVER调用存储过程小结_MsSql

在SQL Server数据库的维护或者Web开发中,有时需要在存储过程或者作业等其他数据库操作中调用其它的存储过程,下面介绍其调用的方法 一.SQL SERVER中调用不带输出参数的存储过程 SQL 代码 --存储过程的定义 create procedure [sys].[sp_add_product] ( @m_viewcount int = 0 ,@m_hotcount int = 0 ) as go --存储过程的调用 declare @m_viewcount int declare @m

SQL SERVER调用存储过程小结

在SQL Server数据库的维护或者Web开发中,有时需要在存储过程或者作业等其他数据库操作中调用其它的存储过程,下面介绍其调用的方法 一.SQL SERVER中调用不带输出参数的存储过程 SQL 代码 --存储过程的定义 create procedure [sys].[sp_add_product] ( @m_viewcount int = 0 ,@m_hotcount int = 0 ) as go --存储过程的调用 declare @m_viewcount int declare @m

五种SQL Server分页存储过程的方法及性能比较

在SQL Server数据库操作中,我们常常会用到存储过程对实现对查询的数据的分页处理,以方便浏览者的浏览.本文我们总结了五种SQL Server分页存储过程的方法,并对其性能进行了比较,接下来就让我们来一起了解一下这一过程. 创建数据库data_Test : create database data_Test GO use data_Test GO create table tb_TestTable --创建表 ( id int identity(1,1) primary key, userN