2013-04-28 68 views
0

我有表学生有ID,FirstName,LastName列。根据Sql Server 2008中的选定列进行搜索

Student Table - ID, FirstName, LastName 

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

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

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

如何为此编写程序?

+1

好了,多少你知道有关存储过程这么远?你到目前为止写过任何代码吗? – hol 2013-04-28 15:10:39

回答

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 

注意,变量应该逃到aviod SQL注入。

+0

请您详细说明为什么它不是推荐的方法。如果我只有transact-sql作为工具在这种情况下,我真的没有看到任何其他的可能性以这种方式创建一个动态查询。推荐的方法是什么? – cproinger 2013-04-28 22:28:06

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 + '%'代替,但你的例子并没有这么说。

当一次搜索多个列时,这是不可行的,而当要搜索的列不是字符串时,它变得复杂。但是,这符合您指定的问题的需求。

0

创建过程V_search @firstName VARCHAR(50), @LastName VARCHAR(50)

作为 开始 申报@SQL为nvarchar(4000)

集SQL = SQL +”选择从*学生C,其中

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

            +'AND c.last_name LIKE ' + 
             CASE WHEN @lastname IS NOT NULL 
              THEN 'LOWER('''[email protected]+''') ' 
              ELSE 'LOWER([email protected]) ' 
             END 
      EXEC sp_executesql @SQL 
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('''[email protected]+''') ' 
              ELSE 'LOWER(c.firstname) ' 
             END + 

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

EXEC sp_executesql @SQL 


END 
go 

Exec V_search 'rag%',null