2012-03-11 1 views
2

я сделал, казалось бы, незначительные изменения добавления 2-ю переменную хранимой процедуры в SQL Server 2008 R2, который использует динамический SQL, и я получаю новую ошибку:Динамический 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 

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

ответ

3

Вы должны окружать параметры даты в одинарные кавычки. И чтобы внедрить их в динамический 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 
+0

+1 для преобразования (что я уже сделал), но также получаю в котировках – kaj

+0

@Aaron Спасибо ... Я работал с вопросами с цитатой и видел ваш пост ... Я вставляю и то и другое в дословном, и, как предложение KAJ, intellisense выделяет convert/char как есть. – StatsViaCsh

+0

@Aaron Спасибо, я побежал, что ему нужно «t3» в предложении except, и это нормально. (работает сейчас) – StatsViaCsh

1

Вы, вероятно, хотите, чтобы бросить @maxDate к символьного типа типа данных, так что он может быть сцеплены с остальной частью динамического SQL (обратите внимание, что я не обнадеживающий динамический 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 для опций преобразовать

+0

Это не очень помогает. Это заканчивается тем, что «WHERE TradingDate <= 2012-03-11», который из-за неявного преобразования фактически интерпретируется как «1905-06-22» против datetime/smalldatetime - вам необходимо окружить строковое представление даты одинарные кавычки, поэтому он не интерпретируется как математическое выражение или целое число. –

+0

@AaronBertrand - Хорошо, я забыл одинарные кавычки. Я просто сосредоточился на попытке связать дату с строкой, не гарантируя, что она будет обработана правильно. – kaj

+0

@KAJ Спасибо за помощь ... Я работал над проблемой котировок, когда видел дополнительные комментарии. Я копирую/вставка вашего редактирования и intellisense выделяет «CONVERT (varchar (20)». – StatsViaCsh

 Смежные вопросы

  • Нет связанных вопросов^_^