我可以在SQL存储过程中传递列名作为input参数吗?
create procedure sp_First @columnname varchar AS begin select @columnname from Table_1 end exec sp_First 'sname'
我的要求是传递列名作为input参数。 我这样试过,但是输出错了。
所以帮帮我
你可以用几种方法来做到这一点。
一个是自己build立查询并执行它。
SET @sql = 'SELECT ' + @columnName + ' FROM yourTable' sp_executesql @sql
如果你select这种方法,非常肯定你的input。 即使你知道你的应用程序只会给出“真实的”列名,如果有人发现你的安全性破解并且能够直接执行SP,那该怎么办呢? 然后他们可以执行任何他们喜欢的任何事情。 使用dynamicSQL,始终始终validation参数。
或者,你可以写一个CASE语句…
SELECT CASE @columnName WHEN 'Col1' THEN Col1 WHEN 'Col2' THEN Col2 ELSE NULL END as selectedColumn FROM yourTable
这是一个更长的啰嗦,但更多的安全。
不,那只是select参数值。 你将需要使用dynamicSQL。
在你的程序中你会有以下几点:
DECLARE @sql nvarchar(max) = 'SELECT ' + @columnname + ' FROM Table_1'; exec sp_executesql @sql, N''
尝试使用dynamicSQL:
create procedure sp_First @columnname varchar AS begin declare @sql nvarchar(4000); set @sql='select ['+@columnname+'] from Table_1'; exec sp_executesql @sql end go exec sp_First 'sname' go
这不可能。 要么使用dynamicSQL(危险)或巨大的情况下expression式(慢)。
你可以传递列的名字,但是你不能像SQL状态一样使用它
Select @Columnname From Table
可以build立一个dynamic的sqlstring并像EXEC (@SQL)
有关更多信息,请参阅dynamicsql上的这个答案。
dynamicSQL优点和缺点
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 = ''''+@Value+ '''' SET @cmd = N'SELECT * FROM ' + @TableName + ' WHERE ' + @ColumnName + ' = ' + @Value EXEC(@cmd) END
正如我已经尝试了一个答案,它正在成功执行,但运行它不正确的输出,上述运作良好
正如MatBailie所提到的那样,这样更安全,因为它不是一个dynamic查询,而且SQL注入的可能性也较小。 我添加了一种情况,你甚至希望where子句是dynamic的。 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
请尝试这个。 我希望它会为你工作。
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 **/