Могу ли я передать имя столбца в качестве входного параметра в SQL хранимой процедуре
create procedure sp_First
@columnname varchar
AS
begin
select @columnname from Table_1
end
exec sp_First 'sname'
Мое требование - передавать имена столбцов в качестве входных параметров.
Я так пробовал, но он дал неправильный результат.
Так помогите мне
Ответы
Ответ 1
Вы можете сделать это несколькими способами.
Во-первых, нужно создать запрос самостоятельно и выполнить его.
SET @sql = 'SELECT ' + @columnName + ' FROM yourTable'
sp_executesql @sql
Если вы выберете этот метод, будьте очень уверены в том, что сможете использовать ваш вход. Даже если вы знаете, что ваше приложение будет давать только "настоящие" имена столбцов, что, если кто-то обнаружит ошибку в вашей безопасности и сможет выполнить SP напрямую? Тогда они могут выполнить практически все, что им нравится. С динамическим SQL всегда всегда проверяйте параметры.
В качестве альтернативы вы можете написать оператор CASE...
SELECT
CASE @columnName
WHEN 'Col1' THEN Col1
WHEN 'Col2' THEN Col2
ELSE NULL
END as selectedColumn
FROM
yourTable
Это немного более длинный, но гораздо более безопасный.
Ответ 2
Нет. Это просто выберет значение параметра. Вам нужно будет использовать динамический sql.
В вашей процедуре у вас будет следующее:
DECLARE @sql nvarchar(max) = 'SELECT ' + @columnname + ' FROM Table_1';
exec sp_executesql @sql, N''
Ответ 3
Попробуйте использовать динамический SQL:
create procedure sp_First @columnname varchar
AS
begin
declare @sql nvarchar(4000);
set @sql='select ['[email protected]+'] from Table_1';
exec sp_executesql @sql
end
go
exec sp_First 'sname'
go
Ответ 4
Это невозможно. Используйте либо динамический SQL (опасный), либо гигантское выражение case (медленное).
Ответ 5
Вы можете передать имя столбца, но вы не можете использовать его в sql statemnt, например
Select @Columnname From Table
Можно построить динамическую строку sql и выполнить ее как EXEC (@SQL)
Для получения дополнительной информации см. этот ответ в динамическом sql.
Динамические плюсы и минусы SQL
Ответ 6
Create PROCEDURE USP_S_NameAvilability
(@Value VARCHAR(50)=null,
@TableName VARCHAR(50)=null,
@ColumnName VARCHAR(50)=null)
AS
BEGIN
DECLARE @cmd AS NVARCHAR(max)
SET @Value = ''''[email protected]+ ''''
SET @cmd = N'SELECT * FROM ' + @TableName + ' WHERE ' + @ColumnName + ' = ' + @Value
EXEC(@cmd)
END
Как я пробовал один из ответов, он выполняется успешно, но при запуске его не дает корректного вывода, это хорошо работает
Ответ 7
Как упоминалось MatBailie
Это гораздо более безопасно, так как это не динамический запрос, и у него меньше шансов на SQL-инъекцию. Я добавил одну ситуацию, когда вы даже хотите, чтобы предложение where было динамическим. XX YY - имена столбцов
CREATE PROCEDURE [dbo].[DASH_getTP_under_TP]
(
@fromColumnName varchar(10) ,
@toColumnName varchar(10) ,
@ID varchar(10)
)
as
begin
-- this is the column required for where clause
declare @colname varchar(50)
set @colname=case @fromUserType
when 'XX' then 'XX'
when 'YY' then 'YY'
end
select SelectedColumnId from (
select
case @toColumnName
when 'XX' then tablename.XX
when 'YY' then tablename.YY
end as SelectedColumnId,
From tablename
where
(case @fromUserType
when 'XX' then XX
when 'YY' then YY
end)= ISNULL(@ID , @colname)
) as tbl1 group by SelectedColumnId
end
Ответ 8
Попробуйте с этим. Надеюсь, это сработает для вас.
Create Procedure Test
(
@Table VARCHAR(500),
@Column VARCHAR(100),
@Value VARCHAR(300)
)
AS
BEGIN
DECLARE @sql nvarchar(1000)
SET @sql = 'SELECT * FROM ' + @Table + ' WHERE ' + @Column + ' = ' + @Value
--SELECT @sql
exec (@sql)
END
-----execution----
/** Exec Test Products,IsDeposit,1 **/