sql - 选择 * 进入失败

标签 sql tsql sql-server-2008-r2

我有以下表结构:

CREATE TABLE [dbo].[UTS_USERCLIENT_MAPPING_USER_LIST]
(
    [MAPPING_ID] [int] IDENTITY(1,1) NOT NULL,
    [USER_ID] [varchar](50) NULL,
    [USER_EMAIL_ID] [varchar](100) NULL,
    [USER_CREATED_DATE] [datetime] NULL,
    [USER_IS_ACTIVE] [bit] NULL,

    CONSTRAINT [PK_UTS_USERCLIENT_MAPPING_USER_LIST] 
       PRIMARY KEY CLUSTERED ([MAPPING_ID] ASC)
       WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
             IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
             ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

在存储过程中,我有这个代码:
ALTER PROCEDURE [dbo].[PROC_UTS_USER_CLIENTMAPPING_LIST_SET] 
    (@RETURN_CODE INT OUTPUT,
     @RETURN_MESSAGE NVARCHAR(512) OUTPUT,
     @XML_USER_LIST xml)
AS
BEGIN TRY
    SELECT
        ROW_NUMBER() OVER(ORDER BY x.value('USERNAME[1]','nvarchar(50)')) AS MAPPING_ID,
        x.value('USERNAME[1]', 'nvarchar(50)') as USER_ID,
        x.value('EMAILID[1]', 'nvarchar(50)') as USER_EMAIL_ID,
        x.value('CREATEDDATE[1]', 'datetime') as USER_CREATED_DATE,
        x.value('ISACTIVE[1]', 'bit') as USER_IS_ACTIVE 
    INTO #tempXML
    FROM @XML_USER_LIST.nodes('/DocumentElement/dtLstUsers') AS TEMPTABLE(x)

    SELECT * 
    INTO UTS_USERCLIENT_MAPPING_USER_LIST 
    FROM #tempXML
END TRY

我的问题是上面的存储过程没有将数据插入 UTS_USERCLIENT_MAPPING_USER_LIST来自 #tempXML table 。

我已经确保 #tempXML表包含值。

enter image description here

最佳答案

您的查询存在一些缺陷:

1 - 您在插入表之前尝试插入 IDENTITY 值而不设置 IDENTITY_INSERT ON,然后将其设置为 OFF

SET IDENTITY_INSERT UTS_USERCLIENT_MAPPING_USER_LIST ON 

2 - SELECT * INTO 表将假定该表不存在并尝试在那里创建它,但会失败 -> 需要使用 INSERT INTO SELECT
INSERT INTO UTS_USERCLIENT_MAPPING_USER_LIST (cols)
SELECT cols
FROM  #temp

3 - 您正在使用 ROW_NUMBER 函数计算 MAPPING_ID,该函数每次都会从 1 到 n(其中 n 是您在 xml 中拥有的节点数),但是您的表在 MAPPING_ID 列上有一个 PRIMARY KEY,这意味着它是唯一的,所以第二次您想插入 MAPPING_ID 1,会失败。

4 - 如果您有一个空的 CATCH 块,它将隐藏您的错误

现在,没有真正了解您对 MAPPING_ID 列的需求的解决方案是将那里的插入语句更改为:
INSERT INTO UTS_USERCLIENT_MAPPING_USER_LIST ([USER_ID], [USER_EMAIL_ID], [USER_CREATED_DATE], [USER_IS_ACTIVE])
SELECT  [USER_ID], [USER_EMAIL_ID], [USER_CREATED_DATE], [USER_IS_ACTIVE]
FROM    #tempXML

或者,如果您以某种方式从 xml 中找到了有效的 MAPPING_ID:
SET IDENTITY_INSERT UTS_USERCLIENT_MAPPING_USER_LIST ON

INSERT INTO UTS_USERCLIENT_MAPPING_USER_LIST ([MAPPING_ID], [USER_ID], [USER_EMAIL_ID], [USER_CREATED_DATE], [USER_IS_ACTIVE])
SELECT  [MAPPING_ID], [USER_ID], [USER_EMAIL_ID], [USER_CREATED_DATE], [USER_IS_ACTIVE]
FROM    #tempXML

SET IDENTITY_INSERT UTS_USERCLIENT_MAPPING_USER_LIST OFF

关于sql - 选择 * 进入失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31806642/

相关文章:

sql - 从 Slick 3.x 中的分组依据中按列选取最大项目

sql - 存储库中的业务规则?

sql - 与聚合交叉应用

sql - SELECT FOR JSON 输出 float 指数

sql - Visual Studio 无法向 SQL Server 添加数据连接

tsql - 如何对父子行进行分组 (SQL)

sql - 从电子表格和 Access 数据库中获取用户 ID

sql-server - SQL Server 将日期时间转换为不带 null 的日期

sql - 按子字符串计算 SQL Server 中的行数

sql - MySQL "ORDER BY"某列具有相同值的行数?