Я предполагаю, что у вас есть что-то вроде этого:
- город (строка)
- состояние (строка)
- почтовый индекс (число / строка)
- необязательные критерии (строковые элементы): для целей этого примера я собираюсь принять программный домен - скажем, что-то вроде телевизионного провайдера. Поэтому примерный вариант: hasExpandedTVPackage, hasHBOpackage и т. Д., Поскольку checkBoxes предоставляют только часть данных, включенных / выключенных bool.
Так, например, у вас есть два флажка на странице: [] Также есть расширенный пакет [] Также есть HBO. и т. д. - в основном «найти всех парней, которые живут в городе, штате, почтовом индексе (и, если, скажем, выбран HBO), а также заплатили за пакет HBO».
Теперь, если вы просто написали SQL самостоятельно, это будет "ВЫБРАТЬ * ОТ ПОЛЬЗОВАТЕЛЕЙ, ГДЕ State = @State AND City = @City AND ZipCode = @ZipCode AND HasHboPackage = 1". Но нам нужно было бы использовать динамический SQL, чтобы соединить это.
Мое предложение состоит в том, чтобы собрать таблицу и создать там дополнительные биты SQL, поэтому все, что вы передаете в хранимый процесс, это идентификаторы выбранных элементов (без передачи входных данных). Пример кода:
DECLARE @Items TABLE
(
ID INT,
DisplayName VARCHAR(200),
SQLStatement VARCHAR(200)
)
INSERT INTO @Items (ID, DisplayName, SQLStatement) VALUES (1, 'Has Expanded Package', 'HasExpandedPackage = 1')
INSERT INTO @Items (ID, DisplayName, SQLStatement) VALUES (2, 'Has HBO Package', 'HasHBOPackage = 1')
SELECT * FROM @Items
DECLARE @City VARCHAR(200)
DECLARE @State VARCHAR(2)
DECLARE @ZipCode VARCHAR(5)
DECLARE @Statement VARCHAR(1000)
DECLARE @SelectedOptions VARCHAR(30)
SET @City = 'Dallas'
SET @State = 'TX'
SET @ZipCode = '12345'
SET @SelectedOptions = '2'
DECLARE @TempOptionsTable TABLE
(
OptionID VARCHAR(3)
)
DECLARE @Delimiter VARCHAR(1)
DECLARE @StartPosition INT
DECLARE @Length INT
DECLARE @Item VARCHAR(3)
SET @Delimiter = ','
WHILE LEN(@SelectedOptions) > 0
BEGIN
SET @StartPosition = CHARINDEX(@Delimiter, @SelectedOptions)
IF @StartPosition < 0
BEGIN
SET @StartPosition = 0
END
SET @Length = LEN(@SelectedOptions) - @StartPosition - 1
IF @Length < 0
BEGIN
SET @Length = 0
END
IF @StartPosition > 0
BEGIN
SET @Item = SUBSTRING(@SelectedOptions, 1, @StartPosition - 1)
SET @SelectedOptions = SUBSTRING(@SelectedOptions, @StartPosition + 1, LEN(@SelectedOptions) - @StartPosition)
END
ELSE
BEGIN
SET @Item = @SelectedOptions
SET @SelectedOptions = ''
END
INSERT INTO @TempOptionsTable (OptionID) VALUES (@Item)
END
DECLARE @StatementTable TABLE
(
StatementID INT IDENTITY,
OptionID INT,
SQLStatement VARCHAR(200)
)
SELECT * FROM @StatementTable
--SELECT I.* FROM @TempOptionsTable TOT INNER JOIN @Items I ON I.ID = TOT.OptionID
INSERT INTO @StatementTable
SELECT I.ID, I.SQLStatement FROM @TempOptionsTable TOT INNER JOIN @Items I ON I.ID = TOT.OptionID
SELECT * FROM @StatementTable
DECLARE @Iterator INT
DECLARE @MaxIndex INT
DECLARE @TempStatement VARCHAR(200)
SELECT @Iterator = MIN(StatementID) FROM @StatementTable
SELECT @MaxIndex = MAX(StatementID) FROM @StatementTable
SELECT @Iterator, @MaxIndex
SELECT @Statement = 'SELECT * FROM Users WHERE City = ''' + @City + ''' AND State = ''' + @State + ''' AND ZipCode = ''' + @ZipCode + ''''
SELECT @Statement
WHILE @Iterator < (@MaxIndex + 1)
BEGIN
SELECT @TempStatement = SQLStatement FROM @StatementTable WHERE StatementID = @Iterator
SET @Statement = @Statement + ' AND ' + @TempStatement
SET @Iterator = @Iterator + 1
END
SELECT @Statement
--EXEC(@Statement)
Таким образом, все, что вам нужно сделать, это добавить новую запись в таблицу выписок, и вы сразу получите привязку данных и дополнительные функции поиска. Вы должны убедиться, что поля города и почтового индекса правильно очищены, поскольку они могут быть потенциально использованы для внедрения SQL, если это открытые текстовые поля (а не выпадающие списки или что-то в этом роде).