我有具有 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.
如何为此编写程序?
我有具有 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.
如何为此编写程序?
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
创建过程 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
您必须使用动态 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 注入。
因为您的表定义很小,所以只有三列可以查询。问题的定义表明您不必一次搜索多个列。这意味着您可以编写一个存储过程,该过程接受一个搜索值 (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 + '%'
改用,但您的示例没有这么说。
当一次搜索多于一列时,这是不可行的,并且当要搜索的列不是字符串时,它会变得复杂。但这满足了您指定的问题的需求。