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

Sql server 2005 如何连接不同的存储过程参数,sql-server-2005,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)=

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

请完成查询,以便它可以具有具有值的参数,并可以根据参数值从数据库中进行搜索。但参数可能会随搜索条件的不同而变化。

对不起,我很难理解您的问题。您的意思是存储过程的使用者可能会指定一些参数的任意子集,并且您希望对这些参数进行筛选

假设以上情况,您有两个选择

一,。 使用where子句,如下所示:

WHERE ([tbl_students].firstName = ISNULL(@firstname,firstName)
  AND ([tbl_students].lastName = ISNULL(@lastName ,lastName )
等等。 这样做的目的是检查您的参数是否有值,如果有,它会将其与列进行比较。如果param为null,那么它会将列与自身进行比较,这将永远不会过滤掉任何内容

在存储过程中使用动态sql,如果参数不为null,则只包含所需where子句的行。
对不起,我很难理解你的问题。您的意思是存储过程的使用者可能会指定一些参数的任意子集,并且您希望对这些参数进行筛选

假设以上情况,您有两个选择

一,。 使用where子句,如下所示:

WHERE ([tbl_students].firstName = ISNULL(@firstname,firstName)
  AND ([tbl_students].lastName = ISNULL(@lastName ,lastName )
等等。 这样做的目的是检查您的参数是否有值,如果有,它会将其与列进行比较。如果param为null,那么它会将列与自身进行比较,这将永远不会过滤掉任何内容

在存储过程中使用动态sql,如果参数不为null,则只包含所需where子句的行。
您可能需要使用动态SQL来实现这一点。首先,我强烈推荐阅读这篇优秀的文章

动态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子句,并且必须确保将整数值正确转换为字符串值。您还必须检查参数是否没有任何可能破坏动态sql的特殊字符,比如撇号

使用动态SQL可能会很痛苦,而且很难做到正确


祝你好运

您可能需要使用动态SQL来实现这一点。首先,我强烈推荐阅读这篇优秀的文章

动态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子句,并且必须确保将整数值正确转换为字符串值。您还必须检查参数是否没有任何可能破坏动态sql的特殊字符,比如撇号

使用动态SQL可能会很痛苦,而且很难做到正确


祝你好运

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

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

目录如下:

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
动态搜索条件的关键是确保使用索引,而不是如何轻松地重用代码、消除查询中的重复或尝试使用同一查询执行所有操作。下面是一篇关于如何处理此主题的非常全面的文章:

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

目录如下:

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
您可以通过使您的初始@query='Select*From dbo.MyTable Where 0=0'并使每个附加子句以'and'开头来避免这些检查,我正要推荐Sommarskog,该站点是一个很好的参考。对于任何想通过TSQL变得更好的人来说,都值得一读。请注意,在他的网站上,他还展示了如何在没有动态SQL的情况下做到这一点,这应该尽可能避免:最好使用参数化查询。当使用如图所示的连接查询时,查询计划重用和SQL注入风险的机会很小。您可以通过选择初始的@query='来避免这些检查
*从dbo.MyTable(其中0=0)开始,并使每个附加子句以“and”开头,我正要推荐Sommarskog,该站点是一个很好的参考。对于任何想通过TSQL变得更好的人来说,都值得一读。请注意,在他的网站上,他还展示了如何在没有动态SQL的情况下做到这一点,这应该尽可能避免:最好使用参数化查询。当使用如图所示的连接查询时,查询计划重用和SQL注入风险的机会很小。