是的,这是可能的。很容易,甚至。尝试设置
@Criteria = "\r\nGO\r\nexec sp_addlogin 'hacker', 'broken'\r\nGO";
该批次将产生错误,但中间的部分仍然会运行,因此欢迎您的新登录。
进行查询的正确方法可能是这样的。
CREATE PROC FindSomething
@StartRowIndex int,
@MaximumRows int,
@Sort int, -- 1-4 representing the columns, say in a dropdown
@Id int,
@Content varchar(max),
@Title varchar(max),
@Status int
AS
SELECT Id,Title,Content,Status
FROM
(
SELECT Id,Title,Content,Status,
ROW_NUMBER() OVER (ORDER BY
CASE when @Sort = 1 then Id
when @Sort = 4 then Status
end,
CASE when @sort = 2 then Title
when @sort = 3 then Content
end) AS StudentReport
FROM YearBook
WHERE (@id is null or @id = Id)
AND (@Content is null or @Content = Content)
AND (@Title is null or @Title = Title)
AND (@status is null or @Status = Status)
) Numbered
WHERE StudentReport >= @StartRowIndex
AND StudentReport <= @StartRowIndex + @MaximumRows
OPTION (RECOMPILE);
GO
在此处阅读有关动态搜索的更多信息:www.sommarskog.se/dyn-search.html
注意:我在排序中将 1/4 和 2/3 分开,因为 CASE 语句的每个分支都必须产生相同的类型,或者是兼容的。int/varchar 在 case 语句中是非常糟糕的组合。