我正在研究一个代码而且我相信我很接近,但每次我调整它时,情况都会变得更糟。
问题:虽然没有显示每个循环的结果,但没有错误。
代码的目的:循环遍历#PostDate
表的元素,并将它们插入到WHERE
子句和其中一列中的动态SQL中。 #PostDates
的日期已转换为VARCHAR
。
该过程包含3个步骤。
创建一个包含稍后将在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;
我正在为下面的代码创建我的表。
IF OBJECT_ID('tempdb..#finaloutput','U') IS NOT NULL
DROP TABLE #finaloutput
CREATE TABLE #finaloutput(
BrandCode NVARCHAR(3),
StayDate DATE)
我正在使用#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
当我使用相同数据类型的#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
它会截断日期。
我会很高兴能得到任何帮助。请告诉我,我会提供任何其他信息。谢谢!
答案 0 :(得分:0)
[问题已解决]
我做了其他方法,而不是尝试将日期转换为varchar,并将它们作为varchar输入到SQL中。
我使用日期并像''' + CONVERT(VARCHAR(10),@suffix,120) + ''' PostDate,
我之前尝试过,但我是一个愚蠢的三明治,当我遇到错误时:
msg Msg 8152,Level 16,State 4,Line 3 字符串或二进制数据将被截断。
关于日期并不是我错误定义的其他专栏。 NVARCHAR(5)
代替NVARCHAR(3)
。愚蠢的我。