Tsql 列名称作为参数,并在T Sql中对其进行求和
我的要求是将Columnname作为参数发送到存储过程,并对该列进行求和 我已经编写了一个小的存储过程来接受列名作为参数,并对其进行求和,但是我得到了一个错误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
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