我可以将它用作存储过程吗?
就像我在"其中"
所做的一样搜索文本框
comboBox用于选择表格中的列
代码:
Create procedure sp_Search
@Searchthis Varchar(50),
@Searchwhat Varchar(50)
as
Select *
from tbl_person
where @Searchwhat = @Searchthis
答案 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;