2010-12-29 1 views
0

Получил хранимую процедуру, которая преобразуется в динамический SQL, причина в том, что дополнительный SQL будет передан в процедуру из внешней системы до ее выполнения.Динамический SQL в хранимой процедуре - параметры Datetime

Ошибка преобразования при преобразовании даты и времени из символьной строки. Вот полная хранимая процедура:

USE [DBName]; 
GO 
SET ANSI_NULLS ON; 
GO 
SET QUOTED_IDENTIFIER ON; 
GO 
ALTER PROCEDURE [DB_Admin].[GetMiniCalendarDataNew] 
@userID int, @startDate datetime, @endDate datetime, @JVID int = 0 

WITH EXEC AS CALLER 
AS 

set nocount on 

declare @SQLQuery AS NVARCHAR(max) 

declare @t as table([day] int, [end] datetime, sortorder int, jv int) 

SET @SQLQuery= 'insert into @t([day], [end], sortorder, jv) 
select day((A.STARTTIME)) [day], max(a.endtime) ''end'', 3 sortorder,min(a.jv) jv 
from DB_Admin.CSTM_CALENDAR a 
join DB_Admin.CSTM_CALENDAR b on a.id<>b.id 
join DB_Admin.CSTM_CALENDARParticipants m1 on a.id=m1.CalendarID 
join DB_Admin.CSTM_CALENDARParticipants m2 on b.id=m2.CalendarID 
join DB_Admin.DTree DTree on a.FolderDataID=DTree.DataID 
where a.starttime between ' + CAST(@startDate AS DATETIME) + ' AND ' + CAST(@endDate AS DATETIME) + 
' AND DTree.OwnerID > 0 
and b.starttime between ' + CAST(@startDate AS DATETIME) + ' AND ' + CAST(@endDate AS DATETIME) + 
' AND a.starttime<b.endtime --find overlapping meetings 
AND a.endtime>b.starttime --find overlapping meetings 
AND M1.PARTICIPANT IN (
select id from DB_Admin.kuaf where id in (
    select id from DB_Admin.kuafchildren 
    where childid=' [email protected]+') 
    or id=' [email protected]+ 
') 
AND M2.PARTICIPANT IN (
select id from DB_Admin.kuaf where id in (
    select id from DB_Admin.kuafchildren 
    where childid='[email protected]+') 
    or id='[email protected]+ 
')'+ 

--Filter on JV 
' AND (exists (select 1 where a.jv='[email protected]+') 
or '[email protected]+'=0'+ 
')'+ 

'group by day(A.STARTTIME)' 

+' insert into @t ([day], [end], sortorder, jv) 
select day(A.STARTTIME) [day], max(a.endtime) ''end'', 2 SORTORDER,min(a.jv) jv 
from DB_Admin.CSTM_CALENDAR a 
join DB_Admin.CSTM_CALENDAR b on a.id<>b.id 
join DB_Admin.CSTM_CALENDARParticipants m1 on a.id=m1.CalendarID 
join DB_Admin.CSTM_CALENDARParticipants m2 on b.id=m2.CalendarID 
join DB_Admin.DTree DTree on a.FolderDataID=DTree.DataID 
where a.starttime between ' + CAST(@startDate AS DATETIME) +' AND ' +CAST(@endDate AS DATETIME)+ 
' AND DTree.OwnerID > 0 
--Filter on JV 
AND (exists (select 1 where a.jv='[email protected]+') 
or '[email protected]+'=0'+') 
and M1.PARTICIPANT IN (
select id from DB_Admin.kuaf where id in (
    select id from DB_Admin.kuafchildren 
    where childid='[email protected]+') 
    or id='[email protected]+ 
') 
group by (A.STARTTIME)'+ 

' insert into @t ([day], [end], sortorder, jv) 
select day(A.STARTTIME) [day], max(a.endtime) ''end'', 1 SORTORDER,min(a.jv) jv 
from DB_Admin.CSTM_CALENDAR a 
join DB_Admin.CSTM_CALENDARParticipants m1 on a.ID=m1.CalendarID 
join DB_Admin.DTree DTree on a.FolderDataID=DTree.DataID 
where a.starttime between '+CAST(@startDate AS DATETIME)+' AND '+CAST(@endDate AS DATETIME)+ 
' AND DTree.OwnerID > 0 
--Filter on JV 
AND (exists (select 1 where a.jv='[email protected]+') 
or '[email protected]+'=0'+ ') 
and M1.PARTICIPANT NOT IN (
select id from DB_Admin.kuaf where id in (
    select id from DB_Admin.kuafchildren 
    where childid='[email protected]+') 
    or id='[email protected]+' 
) 
group by (A.STARTTIME)' 


--format query 
+' select [day], max(month('+CAST(@startDate AS DATETIME)+' [month], max(year('+CAST(@endDate AS DATETIME)+')) [year], max([end]) ''end'', 
    case 
     when max(sortorder)=3 then ''Overlapping'' 
     when max(sortorder)=2 then ''Participating'' 
     when max(sortorder)=1 then ''Existing'' 
     when max(sortorder)=0 then ''Empty'' 

    end sortOrder , min(jv) JVID 
from @t 
group by [day] 
order by sortorder desc' 

--EXEC (@SQLQuery) 

PRINT (@SQLQuery) 

GO 
+0

Извините, это просто заставляет мои глаза истекать кровью, глядя на него. Если вы хотите, чтобы люди помогали, вы должны изолировать бит, вызывающий ошибку, и отформатировать его так, чтобы его было намного легче читать. – ChrisA

+0

Вам нужно преобразовать даты в строки, прежде чем вы сможете их соединить. – Oded

ответ

2

Ну, вам нужно

  • Цитируя их
  • Убедитесь, что они являются строки
  • сделать их язык/региональные настройки безопасного

Итак:

... 
where a.starttime between ''' + CONVERT(varchar(30), @startDate, 126) +''' AND ''' + ... 
... 

Изменить:

int error. Вам нужно CAST @userID, чтобы varchar соединить его. SQL не использует неявные CAST-типы VBA

+0

Спасибо, я сейчас пытаюсь с этим предложением конвертировать. Мой результат теперь терпит неудачу при конвертации в varchar. «Ошибка конверсии при преобразовании значения varchar» в @t ([день], [конец], порядок сортировки, jv) выберите день ((A.STARTTIME)) [день], макс (a.endtime) 'end', 3 sortorder, min (a.jv) jv ..... " – Frode

+0

Попробуйте 121 как формат ODBC, а не ISO. Также PRINT строку перед выполнением – gbn

+0

Преобразование даты, кажется, разрешено. Теперь возникает проблема с преобразованием int, которое не выполняется: преобразование завершилось неудачно при преобразовании значения varchar 'declare @t как table ([day] int, [end] datetime ..... "в тип данных int. Заменили временные параметры datetime временно getdate, чтобы пройти мимо ошибок преобразования. – Frode

0

Я думаю, ваша проблема здесь:

'where a.starttime between ' + CAST(@startDate AS DATETIME) + ' AND ' + CAST(@endDate AS DATETIME) + 

Вы должны преобразовать его в строку, а не даты-времени. См http://msdn.microsoft.com/en-us/library/ms187928.aspx

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

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