存储过程 - 不只搜索一列

时间:2017-02-15 13:40:19

标签: sql sql-server

我可以将它用作存储过程吗?

就像我在"其中"

所做的一样
  • 搜索文本框

  • comboBox用于选择表格中的列

代码:

 Create procedure sp_Search
    @Searchthis Varchar(50),
    @Searchwhat Varchar(50)
 as
    Select * 
    from tbl_person
    where @Searchwhat = @Searchthis

5 个答案:

答案 0 :(得分:2)

不要直接将字符串连接到sql并执行它们。这就是你如何让自己开放sql注入。

create procedure dbo.usp_Search
  @SearchCol varchar(50),
  @SearchValue varchar(50)
as
begin
  set xact_abort, nocount on;
  declare @sql nvarchar(512);
  /* make sure the column specified exists in the table 
    to prevent sql injection :P */
  select @sql ='select * from tbl_person where '+quotename(column_name)+' = @SearchValue;'
  from information_schema.columns c
  where c.Table_Name = 'tbl_person'
    and column_name = @SearchCol

  exec sp_executesql @sql, N'@SearchValue varchar(50)', @SearchValue;
end;
go

答案 1 :(得分:0)

wordlist = [x for x in wordstring.split('-') if x]

答案 2 :(得分:0)

动态sql示例:

wordstring = "one-two--three-"

''''正在逃避'围绕varchar searchthis

最终看起来像

Create procedure sp_Search
    @Searchthis Varchar(50),
    @Searchwhat Varchar(50)
as
    declare @sql varchar(500)

    set @sql = 'select * from tbl_person where ' + @Searchwhat + ' = ''' + @Searchthis + ''''
    exec(@sql)

然后你可以调用Exec(@Sql)

答案 3 :(得分:0)

首先,不要使用为系统过程保留的sp_启动您的过程。您可以在技术上使用它,但sql server将有额外的开销在系统过程中查找它,然后执行您的查询。

您要求根据所选列进行动态查询。

Create procedure Search
    @Searchthis Varchar(50),
    @Searchwhat Varchar(50)
as

DECLARE @sql VARCHAR(400)

SET @sql = 'Select * from tbl_person WHERE ' 
   + @Searchwhat + ' = ' +  '''' + @Searchthis + ''''


exec (@sql)

就个人而言,我不是这种方法的忠实粉丝。为此,您必须为执行该表的用户授予对表的读访问权限。使用存储过程意味着使这不必要(安全性),并且在服务器上创建过程时会丢失一些类型检查(等),因为它在执行之前无法检查查询。它会工作,但我宁愿创建更多的程序来进行搜索,而不是使用一个通用程序。使用这种方法,您可以使用动态sql并删除使用存储过程的额外开发开销。

答案 4 :(得分:0)

您可以通过一个子查询通过案例陈述对您选择的字段进行搜索然后再次加入相关表格来实现您想要的内容。

EG - 只显示了2个字段,但是你得到了图片......

CREATE Table #MyTable(
  id int identity,
  Type Varchar(20),
  Description Varchar(20)
  );

INSERT INTO #MyTable
  SELECT 'Type_A', 'Description A'
  UNION
  SELECT 'Type_B', 'Description B'

--Search by Type
DECLARE @SearchField Varchar(20) = 'Type';
DECLARE @SearchVal Varchar(20) = 'Type_B';
SELECT F.* FROM 
(
SELECT #MyTable.Id,
  CASE 
    WHEN @SearchField = 'Type' THEN Type
    WHEN @SearchField = 'Description' THEN Description
  END as SearchField
FROM #MyTable
)Search_Q
INNER JOIN #MyTable F ON F.Id = Search_Q.Id
WHERE
  SearchField = @SearchVal;

--Search by Description
SET @SearchField = 'Description';
SET @SearchVal = 'Description A';
SELECT F.* FROM 
(
SELECT #MyTable.Id,
  CASE 
    WHEN @SearchField = 'Type' THEN Type
    WHEN @SearchField = 'Description' THEN Description
  END as SearchField
FROM #MyTable
)Search_Q
INNER JOIN #MyTable F ON F.Id = Search_Q.Id
WHERE
  SearchField = @SearchVal;

DROP TABLE #MyTable;