2013-12-04 2 views
0

У меня есть процедура, над которой я работаю, и я не знаю, что происходит. Я просмотрел все другие сайты и не смог найти проблему, что у меня естьДинамическое имя столбца и значение в месте где

Я хочу создать процедуру, которая имеет динамическую базу предложений 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 
+0

Вам необходимо использовать динамический SQL, чтобы добиться этого, не могут иметь переменные, представляющие имена столбцов. sql не предназначен для работы. Ознакомьтесь с этой статьей для получения дополнительной информации о динамическом sql: http://www.sommarskog.se/dynamic_sql.html. – Mack

+0

Вам нужно будет использовать динамический SQL, чтобы делать то, что вы пытаетесь сделать. То есть объявить оператор SELECT как varchar, а затем выполнить команду с параметрами. Наконец, вы вызываете 'sp_executesql' для выполнения полной команды. – SchmitzIT

+0

Я видел этот вопрос. Это не сработает. [StackOverflow] http://stackoverflow.com/questions/12093834/creating-a-dynamic-where-clause-in-sql-server-stored-procedure – user3066155

ответ

2

Я хотел бы избежать использования динамического SQL в целом. Вы можете устранить ваш IF заявление и вставлять один и тот же 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 + '''') 
+0

Это отличная идея. Я попробую это. – user3066155

+0

Это более простой в реализации. благодаря – user3066155

3

л Вы можете разместить Select Statmement в переменной, как:

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) 
+0

Это очень простой способ выполнить динамический sql. Я не знал о процедуре sp_executesql. Спасибо – user3066155

+0

Неплохо, спасибо за это. – CodeSlave

2

это, вероятно, поможет вам:

SELECT 
    id, first, last, email, notes 
FROM 
    My_Table 
WHERE 
    CASE ''''[email protected]_name_variable+'''' 
     WHEN ''''+column_1+''''=1 THEN column_1 
     WHEN ''''+column_2+''''=2 THEN column_2 
     ... 
     ELSE 'not null' 
    END IS NOT NULL 
Смежные вопросы