2013-04-28 58 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