0

Visual Studio TableAdapter Query Wizard 内で SQL クエリを作成しようとしています。

私の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 コンストラクトまたはステートメントはサポートされていません」

これに対する回避策はありますか?

ありがとう。

4

1 に答える 1

3

このようなもの:

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

EVILです。やらないでください。@ApexLine1 のような変数には、次のようなものでも何でも含めることができます。

';DROP TABLE dbAddress--

誰かがあなたの Address Line 1 フィールドにそのようなものを入力したらどうなるか、よく考えてください。ここでの唯一の正しい解決策は、組み込みのsp_executesqlストアド プロシージャを使用することです。それを学び、それを使用してください。

それとは別に、あなたの問題の少なくとも一部は、 @SQL 変数が 255 文字しかないことにあると思います。クエリの容量が不足している可能性は十分にあります。

于 2010-03-03T14:26:18.347 に答える