rahulDer Ответов: 6

Могу ли я передать имя столбца в качестве параметра в хранимой процедуре SQL со стороны кодирования ?


Я хочу передавать имена столбцов со стороны кодирования, а не со стороны базы данных.
потому что у меня есть таблица под названием "studentAttendance", содержащая столбцы типа d1,d2,d3, d4...d30, и эти столбцы имеют значения типа "P", "A","L","C" для ежедневной посещаемости.
Пожалуйста, предложите правильный способ сделать это.

declare @col nchar(50)
        set @col= 'd2'
        
            select count(*) from bat.studentbatch sb
            inner join bat.student_attendance sa on sb.sid=sa.sid
            inner join bat.batchmaster bm on sb.batchid=bm.batchid
            where  bm.facultyid=151-- and bm.batchstatus !='Completed'
            and  @col   ='P'

но этот запрос должен привести к "3" в качестве ответа, но он всегда дает "0", что означает, что это не является допустимым именем столбца или иначе..

OriginalGriff

Это не очень хороший вопрос - мы не можем понять из этого малого, что вы пытаетесь сделать.
Помните, что мы не можем видеть ваш экран, получить доступ к вашему жесткому диску или прочитать ваши мысли.
Почему вы хотите передать имена в качестве параметров?
О каком запросе идет речь?
А что вы пробовали?
Используйте виджет "улучшить вопрос", чтобы отредактировать свой вопрос и предоставить более подробную информацию.

Magic Wonder

Ну а необходимые комментарии уже поставил OriginalGriff. Все, что я могу сказать здесь и что я понял из вашего вопроса, это ....Используйте динамический SQL-запрос. Надеюсь, это вам поможет.

6 Ответов

Рейтинг:
42

coded007

Да, вы можете передать имя столбца в качестве параметра со стороны кодирования, но не таким образом. Вам нужно разработать динамический запрос, чтобы получить имя столбца в запросе. Смотрите ниже код:

declare @col nchar(50)
declare @query nvarchar(max)
set @col= 'd2'

SET @query = 'select count(*) from bat.studentbatch sb
            inner join bat.student_attendance sa on sb.sid=sa.sid
            inner join bat.batchmaster bm on sb.batchid=bm.batchid
            where  bm.facultyid=151'+-- and bm.batchstatus !=''Completed''
            'and '+ @col+' =''P'''

            --SELECT @query
EXEC(@query)


Примечание: комментарии не должны включаться в @Query


Рейтинг:
2

OriginalGriff

Правильно - Нет, не будет. А почему бы и нет? Просто: он компилирует SQL слишком рано для вас, поэтому справедливо предполагает, что @COL-это переменная, а не имя столбца, и во время выполнения сравнивает содержание @COL против 'P' вместо того, чтобы использовать "содержимое столбца, названного @COL".
Вы можете это сделать - это неуклюже и опасно, потому что вам нужно объединить содержимое переменной вместе с остальной частью SQL в строку и выполнить ее, что оставляет вас широко открытыми для проблемы SQL-инъекции, которая может повредить или уничтожить вашу базу данных. Я не рекомендую этого делать.

Вместо этого проверьте содержимое @COL и выполните соответствующий выбор на его основе.

IF @COL='d1'
    SELECT COUNT(*) FROM bat.studentbatch sb
    INNER JOIN bat.student_attendance sa ON sb.sid=sa.sid
    INNER JOIN bat.batchmaster bm ON sb.batchid=bm.batchid
    WHERE bm.facultyid = 151
       AND bm.batchstatus !='Completed'
       AND d1 ='P'
ELSE IF @COL='d2'
    SELECT COUNT(*) FROM bat.studentbatch sb
    INNER JOIN bat.student_attendance sa ON sb.sid=sa.sid
    INNER JOIN bat.batchmaster bm ON sb.batchid=bm.batchid
    WHERE bm.facultyid = 151
       AND bm.batchstatus !='Completed'
       AND d2 ='P'
...
ELSE
   SELECT -1


[no name]

как я могу передать имя столбца в качестве параметра в команде sql?

Рейтинг:
1

Magic Wonder

Привет,

Попробовать это ...

DECLARE @@SQL VARCHAR(2000)
DECLARE @COL VARCHAR(50)

SET @COL= 'D2'

SET @@SQL =' SELECT COUNT(*) FROM BAT.STUDENTBATCH SB INNER JOIN BAT.STUDENT_ATTENDANCE SA ON SB.SID=SA.SID INNER JOIN BAT.BATCHMASTER BM ON SB.BATCHID=BM.BATCHID WHERE  BM.FACULTYID=151 AND ' +  @COL + '  =''P'' '

PRINT @@SQL

EXEC @@SQL


надеюсь, это вам поможет.


Рейтинг:
1

CHill60

В дополнение к решению 1 и комментарию от Magic Wonder вы можете найти эту статью полезной выполнение динамических команд sql[^]


Рейтинг:
1

Murugesan22

регистрация здесь

да вы можете передать имя coloumn в качестве параметра

http://stackoverflow.com/questions/18360118/sql-variables-as-column-names-in-where-clause[^]


Рейтинг:
1

Member 14630343

Нет, вы не можете использовать имена столбцов в качестве параметров SQL. Да, вы можете заменить текст другими строками, однако-это не был заданный вопрос. Ответ - нет.