如何连接不同的存储过程参数

时间:2010-06-04 18:45:22

标签: sql-server-2005

请帮我写这个搜索sql存储过程 程序在不同时间可能有不同数量的参数 所以任何人都可以帮我写这个查询。我不知道如何连接参数。 我是存储过程的新手

CREATE PROCEDURE searchStudent
-- Add the parameters for the stored procedure here
@course int=null,
@branch int=null,
@admissionYear varchar(max)=null,
@passingYear varchar(max)=null,
@userName varchar(max)=null,
@sex varchar(max)=null,
@studyGap varchar(max)=null,
@firstName varchar(max)=null,
@lastName varchar(max)=null
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE query STR DEFAULT null

IF @course IS NOT NULL
THEN query=
SELECT * FROM [tbl_students] WHERE 

END
GO

请完成查询,以便它可以具有值的参数,并可以根据参数值从数据库中搜索。但参数可能每次都有所不同,取决于搜索条件。

3 个答案:

答案 0 :(得分:2)

您可能需要使用动态SQL来实现此目的。首先,我强烈建议阅读这篇优秀的文章。 http://www.sommarskog.se/dynamic_sql.html

你是动态的sql会是这样的;

   Declare @query varchar(max)

   Set @query = 'Select * From dbo.MyTable Where '

   If @Course Is Not Null
   Begin
    Set @query = @query + 'Course = ' + Convert(varchar(10), @Course)
   end

   If @Branch Is Not Null
   Begin
    Set @query = @query + ' and Branch = ' + Convert(varchar(10), @Branch )
   end

这只是一个例子!您需要构建一些检查以确保您有一个(且只有一个)Where子句,您必须确保integer值正确转换为字符串值。您还必须检查参数是否没有任何可能破坏动态sql的特殊字符 - 如撇号('

使用动态SQL可能很痛苦并且很难做到正确。

祝你好运!

答案 1 :(得分:2)

具有动态搜索条件的密钥是确保使用索引,而不是如何轻松地重用代码,消除查询中的重复,或尝试使用相同的查询执行所有操作。这是一篇关于如何处理这个主题的非常全面的文章:

Dynamic Search Conditions in T-SQL by Erland Sommarskog

它涵盖了尝试使用多个可选搜索条件编写查询的所有问题和方法。您需要关注的主要问题不是代码的重复,而是索引的使用。如果您的查询无法使用索引,那么它将执行不良。有几种技术可以使用,可能允许也可能不允许使用索引。

这是目录:

  Introduction
      The Case Study: Searching Orders
      The Northgale Database
   Dynamic SQL
      Introduction
      Using sp_executesql
      Using the CLR
      Using EXEC()
      When Caching Is Not Really What You Want
   Static SQL
      Introduction
      x = @x OR @x IS NULL
      Using IF statements
      Umachandar's Bag of Tricks
      Using Temp Tables
      x = @x AND @x IS NOT NULL
      Handling Complex Conditions
   Hybrid Solutions – Using both Static and Dynamic SQL
      Using Views
      Using Inline Table Functions
   Conclusion
   Feedback and Acknowledgements
   Revision History

答案 2 :(得分:1)

抱歉,我无法理解你的要求。你的意思是sproc的使用者可以指定一些参数的任意子集,你想过滤那些?

假设上面你有两个选择。

1。 使用这样的where子句:

WHERE ([tbl_students].firstName = ISNULL(@firstname,firstName)
  AND ([tbl_students].lastName = ISNULL(@lastName ,lastName )

等。 这样做是检查您的参数是否有值,如果是,它会将它与列进行比较。如果param为null,那么它会将列与其自身进行比较,这将永远不会过滤掉任何内容。

  1. 在你的sproc中使用动态sql,如果param不为null,只需要包含你想要的where子句的行。