Динамическая ссылка на столбцы SQL Server в SP - PullRequest
3 голосов
/ 03 мая 2011

SQL 2008

Здравствуйте,

У меня довольно другая задача в SQL.Это немного сложнее, чем это, но я постараюсь сделать это проще.

Мне нужно как-то динамически ВЫБРАТЬ столбец.Примерно так:

declare @ColName varchar(50)

select @ColName = 'Column1' --This is an actual column name in a real table called 'MyTable'

select @ColName from MyTable where Column2 = 123

Есть ли способ сделать что-то подобное?Буду признателен за любую помощь или направление!

Спасибо, Джейсон

Ответы [ 4 ]

1 голос
/ 03 мая 2011
DECLARE @colNameIn AS varchar(50) = 'Column1'

DECLARE @template AS varchar(MAX) = 'select {@ColName} from MyTable where Column2 = 123' -- This template can be expanded

-- Protect yourself from injection or invalid columns:
DECLARE @ColName AS varchar(50)
SELECT @ColName = COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'MyTable' 
    AND COLUMN_NAME = @ColNameIn

IF @ColName IS NOT NULL
BEGIN
    DECLARE @sql AS varchar(MAX)
    SET @sql = REPLACE(@template, '{@ColName}', QUOTENAME(@ColName))
    EXEC (@sql)
END
1 голос
/ 03 мая 2011

вам нужен динамический SQL, но сначала прочитайте Проклятие и благословения динамического SQL , чтобы убедиться, что вы не откроете себя для SQL Injection

0 голосов
/ 03 мая 2011

Вы можете сделать это как оператор CASE, если вы предварительно определили все допустимые имена столбцов в процедуре.

DECLARE @ColName varchar(50)

SET @ColName = 'Column1'

SELECT CASE @ColName
         WHEN 'Column1' THEN Column1
         WHEN 'Column2' THEN Column2
       END
FROM MyTable
WHERE Column2 = 123
0 голосов
/ 03 мая 2011

Прочитайте ссылку в ответе @SQLMenace!

declare @ColName varchar(50)
select @ColName = 'Column1'

declare @sql varchar(MAX)
select @sql = 'select ' + @ColName + ' MyTable where Column2 = 123'

exec (@sql)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...