请帮我写这个搜索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
请完成查询,以便它可以具有值的参数,并可以根据参数值从数据库中搜索。但参数可能每次都有所不同,取决于搜索条件。
答案 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,那么它会将列与其自身进行比较,这将永远不会过滤掉任何内容。