0

我正在尝试在 Visual Studio TableAdapter 查询向导中编写 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)

我得到错误:

'不支持声明 SQL 结构或语句'

如果我删除 Declare 语句,我会收到错误:

'不支持 Set SQL 构造或语句'

有解决办法吗?

谢谢。

4

1 回答 1

3

像这样的任何东西:

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

邪恶的。不要这样做。像@ApexLine1 这样的变量可以包含任何东西,甚至是这样的:

';删除表 dbAddress--

仔细考虑如果有人在您的地址行 1 字段中输入类似的内容会发生什么。这里唯一正确的解决方案是使用内置sp_executesql存储过程。学习它,使用它。

除此之外,我认为您的问题至少有一部分可能是您的 @SQL 变量只有 255 个字符。您的查询很可能空间不足。

于 2010-03-03T14:26:18.347 回答