动态列名称和值到Where子句

时间:2013-12-04 14:22:21

标签: sql-server sql-server-2008 tsql

我有一个我正在处理的程序,我不知道出了什么问题。我已经审核了所有其他网站,但找不到我遇到的问题

我想创建一个具有动态where子句的过程,该子句基于发送到过程的位组合。我不想创建一堆类似的程序,因为它们的条件略有不同。

我将以下查询放入游标,然后循环遍历游标。请帮忙。

CREATE PROCEDURE [dbo].[procContainTest] (
    @USE_A BIT,
    @USE_B BIT,
    @ValueA VARCHAR(50),
    @ValueB VARCHAR(50),
    @USERID VARCHAR(50)
    )
AS
DECLARE @TEMP_Col1 INT,
    @TEMP_Col2 INT,
    @TEMP_Col3 VARCHAR(50),
    @TEMP_Col4 VARCHAR(50),
    @TEMP_Col5 VARCHAR(50),
    @POINT_ONE NVARCHAR(50),
    @POINT_TWO NVARCHAR(50)

SET @TRIGGER = 0

WHILE @TRIGGER = 0
BEGIN
    -- F2 Booking Term
    IF @USE_A = 1
        AND @USE_B = 1
    BEGIN
        SET @POINT_ONE = 'ColName2'
        SET @POINT_TWO = 'ColName3'
    END

    -- F6 Booking Term
    IF @USE_A = 0
        AND @USE_B = 1
    BEGIN
        SET @POINT_ONE = 'ColName1'
        SET @POINT_TWO = 'ColName2'
    END

    DECLARE INNER_CURSOR CURSOR
    FOR
    SELECT TOP 1 TEMP_Col1 INT,
        TEMP_Col2,
        TEMP_Col3,
        @TEMP_Col4,
        @TEMP_Col5
    FROM TEMP_Table
    WHERE @POINT_ONE = + '''' + @ValueA + ''''
        AND @POINT_TWO = + '''' + @ValueB + ''''
        AND USERID = @USERID
    ORDER BY LENGTH

3 个答案:

答案 0 :(得分:3)

升 您可以将Select语句放在如下变量中:

declare @YourSelectStatement nvarchar(max)

set @YourSelectStatement = '    SELECT TOP 1 TEMP_Col1 INT,
        TEMP_Col2,
        TEMP_Col3,
    FROM TEMP_Table
    WHERE ' + @POINT_ONE + '=' + @ValueA + '
        AND ' + @POINT_TWO + '=' + @ValueB + '
        AND USERID = ' + @USERID + '
    ORDER BY LENGTH'

sp_executesql(@YourSelectStatement)

答案 1 :(得分:2)

我会完全避免使用动态SQL。您可以消除IF语句并在SELECT语句中嵌入相同的logid,如下所示:

SELECT TOP 1 
    TEMP_Col1,
    TEMP_Col2,
    TEMP_Col3,
    TEMP_Col4,
    TEMP_Col5
FROM TEMP_Table
WHERE (@USE_A = 1 AND @USE_B = 1 AND ColName2 = '''' + @ValueA + '''' AND ColName3 = '''' + @ValueB + '''') 
OR (@USE_A = 0 AND @USE_B = 1 AND ColName1 = '''' + @ValueA + '''' AND ColName2 = '''' + @ValueB + '''')

答案 2 :(得分:2)

这可能对你有帮助:

IndexOutOfBoundsException