Проблемы с динамическими переменными sql требуют исправления - PullRequest
2 голосов
/ 11 марта 2012

Я внес незначительное изменение, добавив вторую переменную к хранимой процедуре в SQL Server 2008 R2, которая использует динамический SQL, и я получаю новую ошибку:

Msg 206, Level 16, State 2, Line 1
Operand type clash: date is incompatible with int

когда я запускаю следующий блок кода ниже (следующий за ним мой sproc)

DECLARE @tableName varchar(120)
SET @tableName = 'tblDailySMA'
DECLARE @mxDate DATE
SET @mxDate = dbo.LatestDateWithPricingVolCountOver4k()
EXEC sprocAddDatesSymbolsAndPeriodsToAggregatedStudy @tableName, @mxDate

USE [Market]
GO
/****** Object:  StoredProcedure [dbo].[sprocAddDatesSymbolsAndPeriodsToAggregatedStudy]    Script Date: 03/11/2012 12:55:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sprocAddDatesSymbolsAndPeriodsToAggregatedStudy]
    @table varchar(120), @maxDate DATE

AS

EXEC(
    ';WITH t1 AS
    (
        SELECT Symbol, TradingDate
        FROM tblSymbolsMain
        CROSS JOIN tblTradingDays
        WHERE TradingDate <=' + @maxDate +
    '), 

    t2 AS
    (
        SELECT Symbol, TradingDate, Period
        FROM t1
        CROSS JOIN tblPeriods
    )

    INSERT INTO ' + @table + ' (Symbol, TradeDate, Period)
    (SELECT Symbol, TradingDate, Period
    FROM t2
    EXCEPT
        (SELECT t3.Symbol, t3.TradeDate, t3.Period
         FROM ' + @table + '))')

RETURN

Я уверен, что это очень простое быстрое решение, что я пропускаю? Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 11 марта 2012

Вам необходимо заключить параметры даты в одинарные кавычки. И чтобы встроить их в динамический SQL, вам нужно их избежать.

'... WHERE TradingDate <= ''' + CONVERT(CHAR(8), @maxDate, 112) + ''' ...'

Или сделать его немного легче для чтения (в зависимости от человека, я думаю):

'... WHERE TradingDate <= ' + CHAR(39) + CONVERT(CHAR(8), @maxDate, 112) + CHAR(39) + ' ...'

Возможно, другая проблема заключается в том, что вы не хотите объединять и вызывать функции преобразования и другие встроенные функции внутри EXEC, как насчет:

ALTER PROCEDURE [dbo].[sprocAddDatesSymbolsAndPeriodsToAggregatedStudy]
    @table   VARCHAR(120), 
    @maxDate DATE
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @sql NVARCHAR(MAX) = N';WITH t1 AS
    (
        SELECT Symbol, TradingDate
        FROM tblSymbolsMain
        CROSS JOIN tblTradingDays
        WHERE TradingDate <= ''' + CONVERT(CHAR(8), @maxDate, 112) +
    '''), 
    t2 AS
    (
        SELECT Symbol, TradingDate, Period
        FROM t1
        CROSS JOIN tblPeriods
    )
    INSERT INTO ' + @table + ' (Symbol, TradeDate, Period)
    (SELECT Symbol, TradingDate, Period
    FROM t2
    EXCEPT
        (SELECT t3.Symbol, t3.TradeDate, t3.Period
         FROM ' + @table + '))';

    EXEC sp_executesql @sql;
END
GO
1 голос
/ 11 марта 2012

Вы, вероятно, хотите преобразовать @maxDate в тип данных символьного типа, чтобы его можно было объединить с остальной частью вашего динамического sql (заметьте, я не поощряю dynamic sql)

то есть что-то вроде:

';WITH t1 AS
(
    SELECT Symbol, TradingDate
    FROM tblSymbolsMain
    CROSS JOIN tblTradingDays
    WHERE TradingDate <=''' + CONVERT(varchar(20), @maxDate, 120) + '''
'), 

См. http://msdn.microsoft.com/en-us/library/ms187928.aspx для опций CONVERT

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...