当前位置: 首页 > 面试题库 >

如何将字段名称作为参数传递给存储过程

龙玄天
2023-03-14
问题内容

我正在使用一个存储过程,在其中发送@columnname数据库中其类型为的存储过程,float并且还声明parameter float
当我将列名传递为float时,它给出了错误:

消息8114,将数据类型nvarchar转换为float时出错。

这是我的测试查询

Declare @column float
set @column = 'S_E1'
select Avg(@column) from TBL_SENSORS

当我将参数类型更改为时,varchar它给了我这个错误:

消息8117,操作数数据类型varchar对avg运算符无效。

Declare @column varchar
set @column = 'S_E1'
select Avg(@column) from TBL_SENSORS

我该如何解决?

更新 :

这是我的存储过程:

ALTER PROCEDURE [dbo].[getAvgColumn]
    @ColumnName float,
    @StartDate DateTime,
    @EndDate DateTime,
    @Start int,
    @End int
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    declare @Skip int = 0
    declare @Take int = 4
    declare @count int = 0

    set @count = (select count(@ColumnName) from TBL_SENSORS Where RECORD_TIMESTAMP Between   @StartDate and @EndDate And ( @ColumnName Between @Start And @End ))

    while(@Skip < @count)
    Begin
        select avg(@ColumnName)
        from 
            (select 
                 @ColumnName as cc,
                 row_number() over (order by RECORD_TIMESTAMP) as rn
             from 
                 TBL_SENSORS 
             Where 
                 RECORD_TIMESTAMP Between @StartDate and @EndDate 
                 And (@ColumnName Between @Start And @End)
            ) T
    where 
        rn > @Skip and 
        rn <= @Skip + @Take

    set @Skip = @Skip + @Take
end
END

问题答案:

您需要动态sql。

DECLARE @SQL NVARCHAR(4000)
Declare @column varchar 
set @column = 'S_E1'

SET @SQL = 'select Avg(' + quotename(@column) + ') from TBL_SENSORS'

EXEC sp_executesql @SQL

更新:同时应用了quotename和的建议sp_executesql

新过程:您可以使用动态SQL将数据放入具有已知模式的临时表中。请参考基于别名的列:ColumnToAvg。代替TBL_SENSORS使用#TempSensors。

注意:在生产中,您将要检查#TempSensors是否存在,如果存在则删除。

SET @SQL = 'Select RECORD_TIMESTAMP, '
    + quotename(@ColumnName)   
    + ' as ColumnToAvg 
       INTO #TempSensors
       from TBL_SENSORS
       Where RECORD_TIMESTAMP Between @StartDate and @EndDate 
       And @ColumnName Between @Start And @End'

EXECUTE sp_executesql @sqlCommand
    , N'@StartDate datetime, @EndDate datetime, @Start int, @End int'
    , @StartDate , @EndDate, @Start, @End


 类似资料:
  • 问题内容: 我有大约六种通用但相当复杂的存储过程和函数,我想以一种更通用的方式使用它们。 理想情况下,我希望能够将表名作为参数传递给过程,因为当前它是硬编码的。 我所做的研究表明,我需要将过程中所有现有的SQL转换为使用动态SQL,以便从参数中拼接动态表名称,但是我想知道是否还有一种更简便的方法可以通过另一种方式引用该表? 例如: 如果是这样,如何从表名设置@MyTable变量? 我正在使用SQL

  • 问题内容: 我正在创建一些存储过程来管理我的数据库。特别是,我想创建一个存储过程来编辑特定行的一列,但是我想通过将列名作为参数传递来做到这一点。 那就是我想做的 使用该参数,我找到了要编辑的特定行,并且我想使用该参数来仅编辑我想要的列。 正如我在其他主题上所读到的那样,我已经尝试使用或定义局部变量,但没有找到解决方案。 有什么帮助吗? 问题答案: 您将需要使用 动态SQL : 请注意,正如Paul

  • 问题内容: 我有一个存储过程,它将列名和表名作为参数。 此过程给我一个错误: 必须声明标量变量@TableName 尽管我已经在顶部声明了它。 问题答案: 使用动态SQL:

  • 问题内容: 我有一个存储过程,可以根据两个表选择一个数据列表。第一张表是固定的:。但是第二个表可以是多个表之一。表本身的名称是相同的:。但是,表的架构不同: 用户将从应用程序中选择模式,然后将所选模式作为参数传递给存储过程。 但是,当我在创建存储过程时解析存储过程时,会出现错误。 无论如何,有没有要传递架构名称作为参数? 问题答案: 使用DynamicSql 这样尝试

  • 我试图通过Oracle光标从python到Oracle存储过程(SP)。要求SP获取数据并将数据插入表中。SP取两个参数p1和p2 p1 以下是存储过程的详细信息: p2sys_refcursor,数据将以串联格式(col1|col2|...) 获取cur.callproc(“LIBRA.pt1,[linestr,result]”行中的“DatabaseError:ORA-01036:非法变量名称

  • 问题内容: 例如,这不起作用: 产生: 但是,这按预期工作: 在select语句中使用参数作为表名需要什么语法?这有可能吗? 问题答案: 准备好的语句是您所需要的。