2010-06-04 14 views
1

请帮我写这个搜索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 

请填写查询,以便它可以有,它们是具有价值,可以从数据库参数值的基础上,搜索参数。但参数每次都可能有所不同取决于搜索条件。

回答

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

你可以通过你的初始@query避免这些检查=“SELECT * FROM dbo.MyTable其中0 = 0”,使每一个附加条款开始“AND <子句逻辑>' – 2010-06-04 18:58:57

+0

啊,当然是一个很好的评论。谢谢! – codingbadger 2010-06-04 19:03:50

+1

我刚刚推荐Sommarskog,该网站是一个很好的参考。对于想要使用TSQL更好的人来说,值得一读。请注意,在他的网站上,他还演示了如何在不使用动态SQL的情况下执行此操作,只要有可能就应该避免使用它。) – Meff 2010-06-04 19:06:56

1

对不起,我很难理解你在问什么。你的意思是消费者可能会指定一些任意的参数子集,并且你想过滤这些参数吗?

假设上面有2个选项。

1. 使用WHERE子句是这样的:

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

等 这样做是检查你的参数有一个值,如果是的话,它会比较它的列。如果param为null,那么它会将该列与自己进行比较,从而不会过滤任何内容。

  1. 在你的sproc中使用动态sql,并且只要包含你想要的where子句的行,如果param不为null。
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