Имя столбца в качестве параметра и сделать сумму на это в T Sql - PullRequest
3 голосов
/ 24 октября 2011

Мое требование - отправить имя столбца в качестве параметра в хранимую процедуру и выполнить SUM для этого столбца.

Я написал небольшую хранимую процедуру для принятия имени столбца в качестве параметра и суммирования по нему, но яполучаю ошибку с ним.

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

Я получаю ошибку как "Operand data type nvarchar is invalid for sum operator." при выполнении этой хранимой процедуры.

Любая помощь очень ценится.

Спасибо

Ответы [ 3 ]

4 голосов
/ 24 октября 2011

Вам нужно будет использовать динамический sql, чтобы получить переданное имя столбца, которое будет использоваться таким образом в запросе.

Используйте sp_executesql , включите имя столбца в строку и передайте @beginDate и @endDate в качестве параметров.

2 голосов
/ 24 октября 2011

Если вы знаете имена столбцов, которые являются допустимыми значениями, вы можете использовать CASE, чтобы избежать зла SQL-инъекции :

  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 

Если вам необходимо прибегнуть к динамическому SQL,1006 * проверить ваш ввод, чтобы ему можно было доверять.

0 голосов
/ 24 октября 2011

Да, есть более простой способ, 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...