【发布时间】:2018-03-06 01:36:48
【问题描述】:
我正在尝试创建一个序列值,我需要在使用 SQL Server 2014 的 INSERT 语句中递增该值。我有一个包含最大数字 + 1 的变量,我试图将其插入到临时表中,但是number 需要为插入到 TEMP TABLE 中的每条记录递增。在谷歌搜索这个问题后,我发现我需要在哪里创建一个 DYNAMIC SQL 语句才能使用变量值。但是,当我这样做时,我现在得到一个转换错误。
任何帮助/指导将不胜感激。谢谢。
这是我的代码:
DECLARE @id int;
DECLARE @sql NVARCHAR(MAX);
SET @id = (SELECT MAX(rowNum)+1 FROM dbo.Focus_Export_Econ_DisadvantagedHHS_Staging_TEST)
SET @sql = 'CREATE SEQUENCE dbo.ID_Sequence
AS INT
START WITH ' + @id +
'INCREMENT BY 1
NO MAXVALUE'
EXEC @sql;
SELECT NEXT VALUE FOR @sql, T.*
INTO #TEMP_TEST --DROP TABLE #TEMP_TEST
FROM (SELECT h.SiteID, st.SchoolName, st.CEPSchool, st.StudentID, st.FName, st.LName, st.Grade, UPPER(LEFT(h.Status,1))+LOWER(SUBSTRING(h.Status,2,LEN(h.Status))) as Status,
(CASE
WHEN UPPER(h.Status) = 'FREE' THEN '01'
WHEN UPPER(h.Status) = 'REDUCED' THEN '02'
WHEN UPPER(h.Status) = 'PAID' THEN '00'
END) as EconomicDisadvantageCode,
(CASE
WHEN ltrim(h.AppType) = 'HS Survey' THEN 'HH'
END) as ApplicationTypeCode,
'HouseHold Survey' as ApplicationType,
st.ResAddr, st.City, st.ZipCode, st.State, st.Phone,
CONVERT(VARCHAR(10), CAST(h.Effective_Date as date), 101) as StatusEffectiveDate, h.End_Date, st.SchoolYear,
st.BirthDate, st.AppScanned, st.AppOnline, st.GracePeriodID,
(CASE
WHEN ISNUMERIC(h.APPID) = 1 THEN CONVERT(INT, h.APPID) ELSE NULL
END) as ApplicationID
FROM #TEMP_HHS_Historical_Records h
INNER JOIN dbo.Focus_Export_Econ_DisadvantagedHHS_Staging_TEST st
ON h.CustomerID = st.StudentID) as T;
我得到的错误是:
Msg 245, Level 16, State 1, Line 384
Conversion failed when converting the varchar value 'CREATE SEQUENCE dbo.ID_Sequence
AS INT
START WITH ' to data type int.
【问题讨论】:
-
EXEC (@SQL)不是EXEC @SQL。此外,您需要使用+ CONVERT(nvarchar(MAX),@id) +而不仅仅是+ @id +,因为int的数据优先级比nvarchar更高。 -
你仍然可以保留
next value,因为你没有while循环 -
不幸的是,我在上面的 SELECT NEXT VALUE FOR @sql, T.* 行上收到错误消息:INCORRECT SYNTAX NEAR '@sql'。期望 '.'、ID 或 QUOTED_ID。有什么建议么?谢谢。
标签: sql sql-server tsql