【问题标题】:Trying to INSERT a SEQUENCE number into an INSERT statement but having issue [duplicate]尝试将序列号插入到 INSERT 语句中但有问题 [重复]
【发布时间】: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


【解决方案1】:

我认为问题出在动态 SQL 中。您可以通过以下方式解决此问题:

SET @sql = 'CREATE SEQUENCE dbo.ID_Sequence
    AS INT
    START WITH ' + cast(@id as varchar(255) + '
    INCREMENT BY 1
    NO MAXVALUE'
EXEC (@sql);

我不确定create sequence 语句是否允许使用参数,但这比使用这样的值修改字符串更好。

【讨论】:

  • EXEC @SQL 会给出错误Could not find stored procedure 'CREATE SEQUENCE...'.。它需要我添加的括号。
  • 感谢您的回复。问题。如何将它放入我的 SELECT for NEXT VALUE 或我是否需要 NEXT VALUE?
【解决方案2】:

您需要将 ID 转换为 nvarchar,如下所示:

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 ' + cast(@id as nvarchar(100)) + 
    'INCREMENT BY 1
    NO MAXVALUE'
   exec sp_executesql @sql;

--TO GET THE VALUE INTO @ID
SELECT  @id = NEXT VALUE FOR dbo.ID_Sequence

您只需要创建一次序列。 您可以迭代并获取@id 值。 希望对您有所帮助!

【讨论】:

  • 豪尔赫,感谢您的帮助。但是,如何使用上面的代码将此序列 # 插入到我的 INSERT 语句中? @sql 将如何为我插入的每条记录增加?
  • 还有一个问题,我认为你需要使用 exec sp_executesql @sql;而不是 EXEC @sql
  • 获取序列的下一个值:SELECT NEXT VALUE FOR dbo.ID_Sequence
  • 编辑了答案以显示如何获取@id
  • 豪尔赫,感谢您的时间和帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-31
  • 1970-01-01
  • 2013-11-16
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
相关资源
最近更新 更多