DynamicSQL中的日期 - 不能同意表

时间:2016-10-27 14:34:54

标签: sql-server sql-server-2008 tsql

我正在研究一个代码而且我相信我很接近,但每次我调整它时,情况都会变得更糟。

问题:虽然没有显示每个循环的结果,但没有错误。

代码的目的:循环遍历#PostDate表的元素,并将它们插入到WHERE子句和其中一列中的动态SQL中。 #PostDates的日期已转换为VARCHAR

该过程包含3个步骤。

  1. 创建一个包含稍后将在dynamicSQL中使用的日期的表: (这里是将日期转换为varchar,因为我读到日期不能连接。

    IF OBJECT_ID('tempdb..#PostDate','U') IS NOT NULL
    DROP TABLE #PostDate
    
    CREATE TABLE #PostDate(
    Header NVARCHAR(10))
    
    DECLARE @cnt INT = 0;
    
    WHILE @cnt > - 84
    BEGIN
    INSERT INTO #PostDate (Header) VALUES
    (CONVERT(VARCHAR(10),dateadd(WK,@cnt,@postdate1),120))
     SET @cnt = @cnt - 1;
    END;
    
  2. 我正在为下面的代码创建我的表。

    IF OBJECT_ID('tempdb..#finaloutput','U') IS NOT NULL
    DROP TABLE #finaloutput
    
    CREATE TABLE #finaloutput(
    BrandCode NVARCHAR(3),
    StayDate DATE)
    
  3. 我正在使用#PostDate元素作为变量运行循环[编辑]我已经将代码简化为尽可能多的东西 - 仍然有同样的问题。

    DECLARE @suffix NVARCHAR(10)
    DECLARE #crs INSENSITIVE CURSOR FOR
    
    SELECT Header FROM #PostDate
    FOR READ ONLY
    OPEN #crs
    FETCH NEXT FROM #crs INTO @suffix
    WHILE (@@FETCH_STATUS = 0)
    BEGIN
    DECLARE @str nvarchar(3999)
    SET @str = N';
    
    INSERT INTO #finaloutput
    
    select BrandCode,
    StayDate
    
    FROM #FinalRatEnahnced
    where StayDate < CONVERT(DATETIME,' + @suffix + ', 103) and StayDate >= dateadd(WK,-6,CONVERT(DATETIME,' + @suffix + ', 103))
    
    
      EXECUTE sp_executesql @str
      FETCH NEXT FROM #crs INTO @suffix
      END
      CLOSE #crs
      DEALLOCATE #crs
    
  4. 当我使用相同数据类型的#PostDate中的一个Postdates测试Union的第一部分时,它显示了许多结果:

    DECLARE @PostDate1 VARCHAR(10) = '20160313'
    
    select BrandCode,
           StayDate,
           CONVERT(DATETIME,@PostDate1, 103) PostDate
    from #FinalRatEnahnced
    where StayDate < CONVERT(DATETIME,@PostDate1, 103) and StayDate >= dateadd(WK,-6,CONVERT(DATETIME,@PostDate1, 103))
    

    [编辑]我在将代码简化为以下后发现了真正的问题:

    select ' + @suffix + ' AS Date
    INTO adhoc.ahoc_frcdatatype
    '
    

    我预计它是来自VARCHAR的{​​{1}}类型的日期,而是看到4位数字,如:1993年,2000年,1977年#Postdate,它们甚至不是日期的年份INT。所以我想当我宣布#Postdate它会截断日期。

    我会很高兴能得到任何帮助。请告诉我,我会提供任何其他信息。谢谢!

1 个答案:

答案 0 :(得分:0)

[问题已解决]

我做了其他方法,而不是尝试将日期转换为varchar,并将它们作为varchar输入到SQL中。 我使用日期并像''' + CONVERT(VARCHAR(10),@suffix,120) + ''' PostDate,

一样使用它们

我之前尝试过,但我是一个愚蠢的三明治,当我遇到错误时:

  

msg Msg 8152,Level 16,State 4,Line 3   字符串或二进制数据将被截断。

关于日期并不是我错误定义的其他专栏。 NVARCHAR(5)代替NVARCHAR(3)。愚蠢的我。