create procedure sp_First
@columnname varchar
AS
begin
select @columnname from Table_1
end
exec sp_First 'sname'
我的要求是将列名作为输入参数传递。 我试过这样但是输错了。
所以帮帮我
答案 0 :(得分:53)
您可以通过多种方式完成此操作。
一,是自己构建查询并执行它。
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
这有点长,但更安全。
答案 1 :(得分:10)
没有。那只会选择参数值。您需要使用动态sql。
在您的程序中,您将拥有以下内容:
DECLARE @sql nvarchar(max) = 'SELECT ' + @columnname + ' FROM Table_1';
exec sp_executesql @sql, N''
答案 2 :(得分:9)
尝试使用动态SQL:
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
答案 3 :(得分:6)
这是不可能的。使用动态SQL(危险)或巨大的案例表达(慢)。
答案 4 :(得分:2)
您可以传递列名,但不能在sql statemnt中使用它,如
Select @Columnname From Table
可以构建动态sql字符串并像EXEC (@SQL)
有关更多信息,请参阅有关动态sql的此答案。
答案 5 :(得分:2)
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
我已经尝试了一个答案,它已成功执行,但在运行时没有给出正确的输出,上面的效果很好
答案 6 :(得分:0)
正如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
答案 7 :(得分:0)
首次运行;
CREATE PROCEDURE sp_First @columnname NVARCHAR(128)--128 = SQL Server Maximum Column Name Length
AS
BEGIN
DECLARE @query NVARCHAR(MAX)
SET @query = 'SELECT ' + @columnname + ' FROM Table_1'
EXEC(@query)
END
第二次运行;
EXEC sp_First 'COLUMN_Name'
答案 8 :(得分:-5)
请试试这个。 我希望它对你有用。
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 **/