Я использую ASP. NET и серверную базу данных SQL.
У меня есть варианты поиска значений из таблицы gridview по некоторым критериям. Критерии в основном независимы друг от друга.
Например:
"where ProductType = " + Convert.ToInt32(recordType.persoRecord) +
" and AccountNumber like '%" + SearchValue + "%'";
или
"where fileid=" + File_ID + ShowSearch +
" and lower(j.CardHolderName) like '%" + SearchValue.Trim().ToLower() + "%'
Существует множество вариантов поиска пользователем. У меня есть миллионы строк данных в этой таблице, чтобы извлечь данные и быстро связать их с gridview, я создал хранимую процедуру.
Он отлично работает для извлечения и связывания, но для поиска сложно управлять. Из-за того, что у меня не так много времени, я хочу настроить хранимую процедуру так, чтобы «если есть поиск», извлекал только искомые данные.
Вот моя хранимая процедура:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[SetJobsGrid]
(@FileID varchar(50),
@PageIndex int = 1,
@PageSize int = 1,
@DynamicQuery NVARCHAR(MAX),
@SearchFlag bit,
@RecordCount int output)
AS
BEGIN
DECLARE @SearchQuerySQL as nvarchar(MAX)
SET NOCOUNT ON;
select ROW_NUMBER()OVER (
order by j.creationdate asc,
j.id desc
) AS RowNumber
, j.id as 'Serial #', j.jobname as 'File Record Name',
j.RecordNumber as 'Record Number',i.issuername as'Issuer Name',p.ProductName as 'Product Name',p.productNumber as 'Product Number',
(j.AccountNumber) as AccountNumber ,j.CardHolderName as 'Card Holder Name', j.CardholdersBranchName as 'Card Holder Branch Name',
j.ShipmentBranchName as 'Shipment Branch Name', j.EmbossingCardholderName as 'Embossing Card Holder Name', j.MaskedPAN as 'PAN',
j.creationdate as 'File Record Creation Date', j.status as 'File Record Status', j.chipdatastatuserror as 'ChipDataStatus Erro',
j.chipdatastatuserrormessage as 'Error Message', j.chipdatastatus as 'Data Prepared',j.isduplicaterecord as 'isduplicate',j.isduplicatefromsamefile as 'IsDuplicateFromSameFile',
j.validationerrors , j.isworkordercreatedForCard,j.isworkordercreatedForPin,j.isworkordercreatedForCarrier,j.PersoMachineId,j.PinMachineId,j.CarrierMachineId
INTO #Results
FROM jobs j join issuer i on j.issuerid=i.id join Product p on p.id=j.productid WHERE fileid = @FileID
IF(@SearchFlag = 1)
begin
select @SearchQuerySQL = 'SELECT ' + @RecordCount + ' = COUNT(*) FROM #Results ' + @DynamicQuery
EXEC(@SearchQuerySQL)
select @SearchQuerySQL = 'SELECT * FROM #Results ' + @DynamicQuery + ' and RowNumber BETWEEN(@PageIndex -1) * @PageSize + 1 AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1'
EXEC(@SearchQuerySQL)
end
ELSE
begin
SELECT @RecordCount = COUNT(*)
FROM #Results
SELECT * FROM #Results
WHERE RowNumber BETWEEN(@PageIndex -1) * @PageSize + 1 AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1
end
DROP TABLE #Results
END
Если для SearchFlag
установлено значение true из ASP. NET, я хочу получить только искомое значение. @DynamicQuery
устанавливается из asp, например:
WHERE AccountNumber LIKE '%" + SearchValue + "%'"
или со многими другими случаями.
Когда я запускаю эту хранимую процедуру, как описано выше, я получаю исключение:
Преобразование не удалось при преобразовании значения varchar 'select' в тип данных int
Regards