Запрос SQL в мастере настройки запроса VS TableAdapter - PullRequest
0 голосов
/ 03 марта 2010

Я пытаюсь написать SQL-запрос в Visual Studio TableAdapter Query Wizard

Мой SQL-запрос:

    DECLARE @SQL varchar(255);

SET @SQL = ' SELECT * FROM dbAddress WHERE 1 = 1'

IF @ApexLine1 = ''
    BEGIN
        SET @SQL = @SQL + ' AND addLine1 IS NULL '
    END
ELSE
    BEGIN
        SET @SQL = @SQL + ' AND addLine1 = ''' + @ApexLine1 + ''''
    END

IF @ApexLine2 = ''
    BEGIN
        SET @SQL = @SQL + ' AND addLine2 IS NULL '
    END
ELSE
    BEGIN
        SET @SQL = @SQL + ' AND addLine2 = ''' + @ApexLine2 + ''''
    END

IF @ApexLine3 = ''
    BEGIN
        SET @SQL = @SQL + ' AND addLine3 IS NULL '
    END
ELSE
    BEGIN
        SET @SQL = @SQL + ' AND addLine3 = ''' + @ApexLine3 + ''''
    END

IF @ApexZip = ''
    BEGIN
        SET @SQL = @SQL + ' AND addPostCode IS NULL '
    END
ELSE
    BEGIN
        SET @SQL = @SQL + ' AND addPostCode = ''' + @ApexZip + ''''
    END

IF @ApexCity = ''
    BEGIN
        SET @SQL = @SQL + ' AND addLine4 IS NULL '
    END
ELSE
    BEGIN
        SET @SQL = @SQL + ' AND addLine4 = ''' + @ApexCity + ''''
    END

IF @ApexProv = ''
    BEGIN
        SET @SQL = @SQL + ' AND addLine5 IS NULL '
    END
ELSE
    BEGIN
        SET @SQL = @SQL + ' AND addLine5 = ''' + @ApexProv + ''''
    END

EXEC(@SQL)

Я получаю ошибку:

'Контракт или оператор Declare SQL не поддерживается'

Если я удаляю оператор Declare, я получаю ошибку:

'Конструкция или оператор Set SQL не поддерживается'

Есть ли способ обойти это?

Спасибо.

1 Ответ

3 голосов
/ 03 марта 2010

Что-нибудь вроде этого:

SET @SQL = @SQL + ' AND addLine1 = ''' + @ApexLine1 + ''''

равно ЗЛО . Не делай этого. Переменные типа @ ApexLine1 могут содержать что угодно , даже что-то вроде этого:

'; DROP TABLE dbAddress -

Тщательно продумайте, что произойдет, если кто-то введет что-то подобное в поле «Адресная строка 1». Единственное правильное решение - использовать встроенную хранимую процедуру sp_executesql. Изучи это, используй это.

Кроме того, я думаю, что, по крайней мере, часть вашей проблемы может заключаться в том, что ваша переменная @SQL составляет всего 255 символов. Вполне возможно, что вашему запросу не хватает места.

...