0

ID、FirstName、LastName 列を持つテーブル Student があります。

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

テーブル定義が非常に小さいため、クエリできる列は 3 つだけです。また、問題の定義は、一度に複数の列を検索する必要がないことを示唆しています。つまり、検索値 (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 に答える
0

手順 V_search を作成 @firstname varchar(50), @lastname varchar(50)

As Begin Declare @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 に答える