Несколько значений не вставляются - PullRequest
2 голосов
/ 18 ноября 2011

Использование SQL Server 2000

Я хочу выбрать идентификатор в соответствии с отделом

ID Department
001 H001
002 F001
003 S001
004 D001

Хранимая процедура

ALTER  PROC [dbo].[proc_Atnd1] 
@Dep VARCHAR(100)
AS
BEGIN
DECLARE @SQL VARCHAR(1000)
DECLARE @Flag INT
SELECT @Flag=0
SELECT @SQL = 'SELECT ID FROM Table1 WHERE '
IF @Dep <>'All'
BEGIN
IF @Flag=1 
BEGIN
SELECT @SQL = @SQL+' AND (DEPARTMENT IN ('''+@Dep+'''))'
END
ELSE
BEGIN
SELECT @SQL = @SQL+' (DEPARTMENT IN ('''+@Dep+'''))'
SELECT @Flag=1
END
END
if @SQL = 'SELECT ID FROM Table1 WHERE ' SELECT @SQL = 'SELECT ID FROM Table1'
Delete from tb_Sample
INSERT INTO tb_Sample EXEC(@SQL)
end

Эта хранимая процедура работает для отдельныхили все отделы, но он не работает для нескольких отделов.

  • Если я передаю значение хранимой процедуре, All означает, что он отображает все идентификаторы для этого отдела
  • Если я выберу H001 означает, он отображает идентификатор для H001 отдела.
  • Если я выберу H001 и D001 означает, ничего не отображается.

IЯ передаю значение для нескольких отделов, как это H001,D001,F001 для хранимой процедуры.Но хранимая процедура не вставляет идентификатор для выбранного отдела

В чем проблема с моей хранимой процедурой?

Нужна помощь по хранимой процедуре

Ответы [ 2 ]

1 голос
/ 18 ноября 2011

Во-первых, я бы не советовал создавать динамические операторы SQL, подобные этой ... это может сделать вас уязвимым для атак с использованием SQL-инъекций. Если вам нужно передать строку с разделенным запятыми списком, я бы вместо этого проанализировал этот список и вставил каждое отдельное значение во временную таблицу. Оттуда вы можете присоединиться к временной таблице вместо использования оператора IN.

Однако проблема здесь в том, что вы окружаете разделенный запятыми список кавычками, поэтому вместо поиска значений H001, D001 и F001 ... он ищет одно значение равно 'H001', 'D001', 'F001'

Чтобы исправить вашу проблему, вы должны изменить свой оператор выбора на:

SELECT @SQL = @SQL+' (DEPARTMENT IN ('+@Dep+'))'

А когда вы передаете список через запятую, заключите каждое отдельное значение в кавычки в строке следующим образом:

РЕДАКТИРОВАТЬ: Изменено с назначения переменной на вызов хранимой процедуры, чтобы сделать более понятным то, что я предлагаю.

exec dbo.proc_Atnd1 '''H001'', ''D001'', ''F001'''

Что-то полезное при устранении неполадок этих типов - это PRINT из созданного вами SQL-кода, а затем изучите его и убедитесь, что он выполняет то, что вы ожидаете.

Но опять же, я бы предложил, чтобы вы не использовали этот подход, а вместо этого изучили синтаксический анализ списка и избежали динамического SQL.

0 голосов
/ 18 ноября 2011

Передайте свое значение для нескольких отделов с помощью экранированных одинарных кавычек, а не двойных кавычек. Например:

EXEC [dbo].[proc_Atnd1] 'H001'', ''D001'', ''F001'
...