0

我有具有 ID、FirstName、LastName 列的学生表。

Student Table - ID, FirstName, LastName

我会将 ColumnName 和 searchText 传递给过程。

e.g. ColumnName=FirstName, SearchText="John"

And the procedure will return the records having FirstName as John.

如何为此编写程序?

4

4 回答 4

0
create table student
( 
ID_no varchar(50),
firstname varchar(50),
lastname varchar(50),
section varchar(50),
Department varchar(50),
Place varchar(50) );

Create procedure V_search
 @firstname varchar(50),
 @lastname varchar(50)

As 
Begin 
 Declare @SQL nvarchar(4000)

 Set @SQL = ' Select * from student C where  

                                    c.firstname like ' + CASE WHEN @firstname IS NOT NULL
                                            THEN 'LOWER('''+@firstname+''') '   
                                            ELSE 'LOWER(c.firstname) ' 
                                        END  +

                                     'AND c.lastname LIKE ' +  
                                        CASE WHEN @lastname IS NOT NULL
                                            THEN 'LOWER('''+@lastname+''') ' 
                                            ELSE 'LOWER(c.lastname) ' 
                                        END +''
Print @sql

EXEC sp_executesql @SQL


END 
go

Exec V_search 'rag%',null
于 2013-04-30T09:40:13.093 回答
0

创建过程 V_search @firstname varchar(50), @lastname varchar(50)

作为开始声明@SQL nvarchar(4000)

Set SQL=SQL +' Select * from student C where

                                    c.first_name like ' + CASE WHEN @firstname IS NOT NULL
                                            THEN 'LOWER('''+@firstname+''') '   
                                            ELSE 'LOWER(c.first_name) ' 
                                        END

                                     +'AND c.last_name LIKE ' +  
                                        CASE WHEN @lastname IS NOT NULL
                                            THEN 'LOWER('''+@lastname+''') ' 
                                            ELSE 'LOWER(c.@lastname) ' 
                                        END 
            EXEC sp_executesql @SQL
于 2013-04-30T09:19:55.413 回答
0

您必须使用动态 SQL 编写此过程。出于多种原因,不推荐使用这种方法,但从技术上讲,它可以通过以下方式完成:

CREATE PROCEDURE pr_search
    @filterCol nvarchar(100)
   ,@filterVal nvarchar(100)    
AS
BEGIN
    declare @query nvarchar(100)
    SET @query = 'SELECT * '
               + ' FROM TableB'
               + ' WHERE ' + @filterCol + ' = @0'
    exec sp_executesql @query, N'@0 nvarchar(100)', @filterVal
END

请注意,应该对变量进行转义以避免 SQL 注入。

于 2013-04-28T16:50:32.293 回答
0

因为您的表定义很小,所以只有三列可以查询。问题的定义表明您不必一次搜索多个列。这意味着您可以编写一个存储过程,该过程接受一个搜索值 (SearchText) 和一个指示要搜索的列的控制参数 (ColumnName)。

CREATE PROCEDURE StudentSearch
(
    @ColumnName  varchar(50)
,   @SearchText  varchar(100)
)
AS
BEGIN
    SELECT   ID
         ,   FirstName
         ,   LastName
    FROM     [Student Table]
    WHERE    (@ColumnName = 'FirstName' AND FirstName = @SearchText)
       OR    (@ColumnName = 'LastName'  AND LastName = @SearchText)
END

如果问题要求您能够根据子字符串找到名称,则可以FirstName LIKE '%' + @SearchText + '%'改用,但您的示例没有这么说。

当一次搜索多于一列时,这是不可行的,并且当要搜索的列不是字符串时,它会变得复杂。但这满足了您指定的问题的需求。

于 2013-04-28T17:36:50.737 回答