Скажем, у вас есть WIDGETS
таблица:
- WidgetID int
- ColorID int (значения поиска: красный, синий, зеленый, желтый, черный, коричневый)
- SizeID int (значения поиска: маленький, средний, большой, большой)
- Weight int (Значения поиска: UltraLight, Light, Normal, Heavy, UltraHeavy
Хорошо, это общая идея стола. Мне не нужны имена поиска, у меня есть идентификаторы поиска. Итак, из этой таблицы я бы смог получить списки, которые встречаются, скажем, по следующим критериям:
- Показать мне все виджеты красного, синего или черного цвета
- Показать мне все виджеты красного или синего и малого или среднего размера
- Показать мне все виджеты, которые только Heavy
- Покажите мне все виджеты, которые тяжелые и желтые
- Покажите мне все виджеты, которые тяжелые и желтые и маленькие или большие
- Показать мне все виджеты, которые только Large
- Показать мне все виджеты, которые только зеленые
Получите идею? Я пытался работать с Stored Proc, который позволил мне отправить некоторые параметры. Даже пробовал динамический sql, но получал странные ошибки. не могу вспомнить сейчас.
Моя попытка № 3, вроде бы работает, если бы я мог заставить ее работать в Proc и быть в состоянии определить, какое соединение я хочу
Примеры того, что я пробовал:
Примечание: В моих примерах: (CourseID - это WidgetID) и (StateID - это ColorID) и (CreditTypeID - SizeID) и (SubjectID - WeightID)
Метод попытки 1
ALTER PROCEDURE [dbo].[CourseListFullInfoByStateCreditSubject]
@StateIDs VARCHAR(200) = '',
@CreditTypeIDs VARCHAR(200) = '',
@SubjectTypeIDs VARCHAR(200) = ''
AS
BEGIN
DECLARE @SQL AS NVARCHAR(MAX)
SET @SQL = 'SELECT DISTINCT
C.CourseID,
LU.FirstName,
LU.LastName,
(SELECT COUNT(ReviewID) FROM Review AS R WHERE R.CourseID = C.CourseID) AS ReviewCount
FROM [Course] AS C WITH(NOLOCK)
JOIN LexUser AS LU ON LU.LexUserID = C.PresenterID '
If @StateIDs IS NOT NULL AND @StateIDs <> '''' AND @StateIDs <> '0'
BEGIN
SET @SQL = @SQL + ' JOIN CourseToState AS CS ON CS.CourseID = C.CourseID AND CHARINDEX('','' + CAST(CS.StateID AS VARCHAR) + '','', '','' + @StateIDs + '','') > 0 '
END
If @CreditTypeIDs IS NOT NULL AND @CreditTypeIDs <> '' AND @CreditTypeIDs <> '0'
BEGIN
SET @SQL = @SQL + 'JOIN CourseToCreditType As CC ON CC.CourseID = C.CourseID AND CHARINDEX('','' + CAST(CC.CreditTypeID AS VARCHAR) + '','', '','' + @CreditTypeIDs + '','') > 0 '
END
If @SubjectTypeIDs IS NOT NULL AND @SubjectTypeIDs <> '' AND @SubjectTypeIDs <> '0'
BEGIN
SET @SQL = @SQL + 'JOIN CourseToSubject As CSu ON CSu.CourseID = C.CourseID AND CHARINDEX('','' + CAST(CSu.SubjectID AS VARCHAR) + '','', '','' + @SubjectTypeIDs + '','') > 0 '
END
EXEC sp_executesql @SQL
При попытке 1 я пытаюсь отправить в ID:
[CourseListFullInfoByStateCreditSubject] ''1,2,4'', ''0'', ''0''
... но я получаю сообщение об ошибке "Неверный синтаксис рядом с '1'."
Попытка метода 2, выдает ту же ошибку
DECLARE @SQL AS NVARCHAR(MAX)
SET @SQL = 'SELECT DISTINCT
C.CourseID,
LU.FirstName,
LU.LastName,
(SELECT COUNT(ReviewID)
FROM Review AS R
WHERE R.CourseID = C.CourseID) AS ReviewCount
FROM [Course] AS C WITH(NOLOCK)
JOIN LexUser AS LU ON LU.LexUserID = C.PresenterID '
If @StateIDs IS NOT NULL AND @StateIDs <> '''' AND @StateIDs <> '0'
BEGIN
SET @SQL = @SQL + ' JOIN CourseToState AS CS ON CS.CourseID = C.CourseID AND CHARINDEX('','' + CAST(CS.StateID AS VARCHAR) + '','', '','' + @StateIDs + '','') > 0 '
END
If @CreditTypeIDs IS NOT NULL AND @CreditTypeIDs <> '' AND @CreditTypeIDs <> '0'
BEGIN
SET @SQL = @SQL + 'JOIN CourseToCreditType As CC ON CC.CourseID = C.CourseID AND CHARINDEX('','' + CAST(CC.CreditTypeID AS VARCHAR) + '','', '','' + @CreditTypeIDs + '','') > 0'
END
If @SubjectTypeIDs IS NOT NULL AND @SubjectTypeIDs <> '' AND @SubjectTypeIDs <> '0'
BEGIN
SET @SQL = @SQL + 'JOIN CourseToSubject As CSu ON CSu.CourseID = C.CourseID AND CHARINDEX('','' + CAST(CSu.SubjectID AS VARCHAR) + '','', '','' + @SubjectTypeIDs + '','') > 0'
END
Метод попытки 3 - Вид работ
Этот метод работает, только если я отправляю ему идентификаторы для каждого поля, я не могу оставить один пробел, чтобы получить «все», и не могу заставить его работать в хранимом процессе, что я и пытался сделать в «Попытке № 2»
DECLARE @StateIDs VARCHAR(200) = ''
DECLARE @CreditTypeIDs VARCHAR(200) = ''
DECLARE @SubjectTypeIDs VARCHAR(200) = ''
SET @StateIDs = '1,3,2,'
SET @CreditTypeIDs = '1,3'
SET @SubjectTypeIDs = '1,2,3,4'
SELECT DISTINCT
C.CourseID,
LU.FirstName,
LU.LastName,
(SELECT COUNT(ReviewID) FROM Review AS R WHERE R.CourseID = C.CourseID) AS ReviewCount
FROM [Course] AS C WITH(NOLOCK)
JOIN LexUser AS LU ON LU.LexUserID = C.PresenterID
JOIN CourseToState AS CS ON CS.CourseID = C.CourseID AND CHARINDEX(',' + CAST(CS.StateID AS VARCHAR) + ',', ',' + @StateIDs + ',') > 0
JOIN CourseToCreditType As CC ON CC.CourseID = C.CourseID AND CHARINDEX(',' + CAST(CC.CreditTypeID AS VARCHAR) + ',', ',' + @CreditTypeIDs + ',') > 0
JOIN CourseToSubject As CSu ON CSu.CourseID = C.CourseID AND CHARINDEX(',' + CAST(CSu.SubjectID AS VARCHAR) + ',', ',' + @SubjectTypeIDs + ',') > 0