Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql 列名称作为参数,并在T Sql中对其进行求和_Tsql_Sql Server 2008 - Fatal编程技术网

Tsql 列名称作为参数,并在T Sql中对其进行求和

Tsql 列名称作为参数,并在T Sql中对其进行求和,tsql,sql-server-2008,Tsql,Sql Server 2008,我的要求是将Columnname作为参数发送到存储过程,并对该列进行求和 我已经编写了一个小的存储过程来接受列名作为参数,并对其进行求和,但是我得到了一个错误 CREATE PROCEDURE dbo.testCol -- Add the parameters for the stored procedure here @type as nvarchar(20), @beginDate as smalldatetime, @endDate as smalldate

我的要求是将Columnname作为参数发送到存储过程,并对该列进行求和

我已经编写了一个小的存储过程来接受列名作为参数,并对其进行求和,但是我得到了一个错误

CREATE PROCEDURE dbo.testCol
    -- Add the parameters for the stored procedure here
    @type as nvarchar(20),
    @beginDate as smalldatetime,
    @endDate as smalldatetime
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here


        select dbo.mytable.date, sum(@type) as quantity 
        from dbo.mytable
            where dbo.mytable.Date between @beginDate AND @endDate
        group by dbo.mytable.date,dbo.mytable.day 
        order by dbo.mytable.date
END
GO
由于操作数数据类型nvarchar对sum运算符无效,我收到错误。在执行此存储过程时

非常感谢您的帮助


谢谢

您需要使用动态sql来获取传递的列名,以便在查询中以这种方式使用


使用sp_executesql并在字符串中包含列名,并将@beginDate和@endDate作为参数传递。

是的,有一种更简单的方法,Coolcake。只需先强制转换变量,如下所示:

CREATE TABLE FOO
(N VARCHAR(20))

SELECT * FROM DBO.FOO
INSERT INTO FOO VALUES('10')
INSERT INTO FOO VALUES('20')
INSERT INTO FOO VALUES('30')
INSERT INTO FOO VALUES('40')
INSERT INTO FOO VALUES('50')

SELECT SUM(CAST(N AS INT)) FROM FOO

如果您知道列名是有效值,则可以使用CASE来避免以下缺点:


如果您必须求助于动态SQL,请检查您的输入,以便它可以被信任

谢谢你的回复。除了使用动态sql,没有其他方法了吗?因为我想避免它。请参阅SqlACID的答案。如果您知道所有可能作为参数传递的列,那么这是一种避免使用CASE的方法。顺便说一句,为了避免SQL注入,您可以验证它们传递的确实是表中的一列。可能测试条件:如果不存在,请从sys.columns c中选择*,其中c.object_id=object_id'dbo.mytable'、'U'和[name]=@type。此外,当您将其添加到字符串中时,请确保用方括号将其包围,即“['+@type+]”。这不是问题所在。OP试图将列名作为参数传递给聚合函数。错误消息中提到的nvarchar就是该名称。因此,这并不是关于一些数字或数字存储为nvarchar,因为你似乎已经假设。谢谢你的答复,但我不知道所有的值,将有我的专栏,所以我不能在这里使用案例陈述。非常感谢你的帮助。
  select dbo.mytable.date, 
         sum(case @type when 'QuantityColumn1' then QuantityColumn1 
                         else QuantityColumn2 end ) as quantity  
        from dbo.mytable 
            where dbo.mytable.Date between @beginDate AND @endDate 
        group by dbo.mytable.date,dbo.mytable.day  
        order by dbo.mytable.date