Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 选择*进入失败_Sql_Tsql_Sql Server 2008 R2 - Fatal编程技术网

Sql 选择*进入失败

Sql 选择*进入失败,sql,tsql,sql-server-2008-r2,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]

我有以下表格结构:

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
我的问题是,上面的存储过程并没有将数据从tempXML表插入UTS_USERCLIENT_MAPPING_USER_列表

我已经确保tempXML表包含值


看起来您需要按照Sparky的建议打开IDENTITY\u INSERT。

根据我的理解,您需要提及除映射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

另外一个可能的解决方案是根本不使用标识列——以防不需要它。如果此表仅从此存储过程获取数据,则无需使用标识列:

CREATE TABLE [dbo].[UTS_USERCLIENT_MAPPING_USER_LIST](
    [MAPPING_ID] [int] 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]

您的查询中存在一些缺陷:

1-您正在尝试插入标识值,但在插入到表中之前未将IDENTITY\u insert设置为ON,然后将其设置为OFF

SET IDENTITY_INSERT UTS_USERCLIENT_MAPPING_USER_LIST ON 
2-SELECT*INTO table将假定该表不存在,并将尝试在那里创建它,将失败->需要使用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列上有一个主键,这意味着它是唯一的,因此第二次要插入MAPPING_ID 1时,它将失败

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

现在,如果不真正了解您对映射_ID列的需求,解决方案是将此处的insert语句更改为:

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中找到了有效的映射\u 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
真正的问题是

选择*始终创建新表

因此,我需要在创建现有表之前删除它

当我:

DROP TABLE UTS_USERCLIENT_MAPPING_USER_LIST 

 SELECT * 
    INTO UTS_USERCLIENT_MAPPING_USER_LIST 
    FROM #tempXML
然后它成功了


谢谢。

你就不能跳过临时桌吗

-- TRUNCATE TABLE HERE, IF NEED BE

INSERT INTO UTS_USERCLIENT_MAPPING_USER_LIST (<ColumnList>)
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 
FROM @XML_USER_LIST.nodes('/DocumentElement/dtLstUsers') AS TEMPTABLE(x)

您遇到了什么错误?或者当您说存储过程没有插入数据时,会发生什么情况?似乎您正在尝试更新标识字段映射\u ID。您可能需要调整标识\u INSERTtable已存在,PK上的重复值-请参阅下面的我的答案,了解存储过程无法工作的问题列表。如果不需要drop语句,则上述逻辑可以工作。如果您解决了问题,请不要忘记给出帮助您找到问题的答案。