我编写了这个程序,以便为gridview获取页面记录。 一切都很好,但现在还需要将记录计数作为输出参数。 例如,如果与名称匹配的总记录数为100,则查询应该生成一些记录并输出数字100。 记录部分正在运作。我怎样才能得到计数。
ALTER STORED PROCEDURE GetData
@SearchText nvarchar(50),
@SortOrder nchar(10),
@ColName nvarchar(20),
@StartIndex int,
@PageSize int,
@RecCount int output
AS
BEGIN
DECLARE @Query nvarchar(max), @Params nvarchar(max)
IF @SearchText = ''
SET @SearchText = null
ELSE
SET SearchText = '''%'+@SearchText+'%'''
SET @Params = '@StartIndex int, @PageSize int, @RecCount int output'
SET @Query = 'WITH TBL AS
(
SELECT * FROM tblEmployee
WHERE ('+@ColName+' LIKE '+@SearchText+' OR '+@SearchText+'
IS NULL) AND DELETED = 0;
SELECT @RecCount = @@ROWCOUNT
)
SELECT ROW_NUMBER() OVER(ORDER BY '+@ColName+' '+@SortOrder+'
)Row, * INTO #Result FROM TBL
SELECT * FROM #Result Where Row BETWEEN @StartIndex
AND @PageSize
DROP TABLE #Result'
Execute sp_Executesql @Query, @Params, @StartIndex,@PageSize, @RecordCount output
SELECT @RecCount
答案 0 :(得分:1)
你需要做这样的事情
DECLARE @Table NVARCHAR(MAX);
DECLARE @ColName NVARCHAR(128) = 'Collumn_Name'
DECLARE @SearchText NVARCHAR(4000) = 'Search_Word'
SET @Table = 'SELECT * FROM tblEmployee
WHERE ('+ QUOTENAME(@ColName) +' LIKE @SearchText OR @SearchText
IS NULL)'
Execute sp_Executesql @Table
, N'@SearchText NVARCHAR(4000)'
, @SearchText
将参数传递给sp_Executesql会保护您免受SQL注入攻击。
另外
就OUTPUT而言,此查询返回一个表,您无法将其保存为一个参数。如果您尝试检索一个值,则可以使用OUTPUT参数。
要在动态sql中使用OUTPUT,您需要执行类似的操作....
DECLARE @Table NVARCHAR(MAX);
DECLARE @ColName NVARCHAR(128) = 'ColumnName'
DECLARE @SearchText NVARCHAR(4000) = 'Search_Word'
DECLARE @Out_Param INT OUTPUT
SET @Table = N'SELECT *
FROM tblEmployee
WHERE ('+ QUOTENAME(@ColName) + N' LIKE @SearchText OR @SearchText
IS NULL) ' +
N'SELECT @Out_Param = @@ROWCOUNT'
Execute sp_Executesql @Table
, N'@SearchText NVARCHAR(4000), @Out_Param INT OUTPUT'
, @SearchText
, @Out_Param OUTPUT --<- use OUTPUT key word here
SELECT @Out_Param
<强>更新强>
是的,我已经在您的查询中修复了近10种不同的内容,但无法解释所有内容,但比较您的查询和我现在编写的查询从ALTER STORED PROCEDURE GetData
开始
ALTER PROCEDURE GetData
@SearchText NVARCHAR(50),
@SortOrder NVARCHAR(10),
@ColName NVARCHAR(120),
@StartIndex INT,
@PageSize INT,
@RecCount INT OUTPUT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Query nvarchar(max);
IF (@SearchText = '')
BEGIN
SET @SearchText = null
END
ELSE
BEGIN
SET @SearchText = '''%'+ @SearchText +'%'''
END
SET @Query = N'WITH TBL AS
(
SELECT *, ROW_NUMBER() OVER(ORDER BY '+ QUOTENAME(@ColName) + N' @SortOrder ) As Row
FROM tblEmployee
WHERE ( '+ QUOTENAME(@ColName) + N' LIKE @SearchText OR @SearchText
IS NULL) AND DELETED = 0
)
SELECT * INTO #Result
FROM TBL
SELECT @RecCount = @@ROWCOUNT;
SELECT *
FROM #Result
Where Row BETWEEN @StartIndex AND @PageSize
DROP TABLE #Result'
Execute sp_Executesql @Query
, N'@SearchText NVARCHAR(50),@SortOrder NVARCHAR(10),@StartIndex INT,@PageSize INT,@RecCount INT OUTPUT'
, @SearchText
, @SortOrder
, @StartIndex
, @PageSize
, @RecCount OUTPUT
SELECT @RecCount
END
答案 1 :(得分:0)
这是一种格式化的评论。这不是一个尝试回答。
你确定一切都很好吗?假设您的c#程序传递的是“firstname”的@ColName和“fred”的@SearchText。这意味着这段代码:
SELECT * FROM tblEmployee
WHERE ('+@ColName+' LIKE '+@SearchText+' OR '+@SearchText+'
IS NULL)
变为
SELECT * FROM tblEmployee
WHERE (firstname LIKE 'fredORfred'
IS NULL)
首先,它不是有效的sql。它会抛出一个语法错误,因为你不能拥有像这样的东西,并且像这样一起为空。
其次,为什么你有“或@SearchText”?它几乎可以保证不会找到任何记录。
最后,你的c#程序是否用百分号标记了SearchText变量?如果没有,您的关键字行为就像一个等号。