无法将 NULL 值插入列 'USERNAME'、table 'tempdb.dbo.#temptable 错误
Cannot insert NULL values into column 'USERNAME', table 'tempdb.dbo.#temptable error
我有SP。执行时出现错误
Cannot insert the value NULL into column 'USERNAME', table 'tempdb.dbo.#temptable__________________________________________________________________________________________________________0000000002FD'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
下面是我的SP
ALTER PROCEDURE [dbo].[UserReportData]
@As_ONDATE Datetime
AS
BEGIN
DECLARE @REPORTDATE datetime
DECLARE @USERNAME varchar(110)
Select * INTO #temptable
FROM
(
select a.CUser_id, b.User_Id, a.U_datetime
as REPORTDATE, b.first_Name + ' ' + b.last_name as USERNAME
from inward_doc_tracking_trl a inner join user_mst b
on a.CUser_id = b.mkey
and a.U_datetime >= @As_ONDATE
) as x
DECLARE Cur_1 CURSOR
FOR SELECT CUser_id, User_Id FROM #temptable
OPEN Cur_1
DECLARE @CUser_id INT
DECLARE @User_Id INT
FETCH NEXT FROM Cur_1
INTO @CUser_id, @User_Id
WHILE (@@FETCH_STATUS = 0)
BEGIN
SELECT @REPORTDATE = U_datetime FROM inward_doc_tracking_trl
where U_datetime >= @As_ONDATE
UPDATE #temptable
SET REPORTDATE = @REPORTDATE,
USERNAME = @USERNAME
WHERE CUser_id = @CUser_id
AND User_Id = @User_Id
FETCH NEXT FROM Cur_1 INTO @CUser_id, @User_Id
END
CLOSE Cur_1
DEALLOCATE Cur_1
SELECT * FROM #temptable
DROP TABLE #temptable
END
更新程序
ALTER PROCEDURE [dbo].[UserReportData]
@As_ONDATE Datetime
AS
BEGIN
DECLARE @REPORTDATE datetime
DECLARE @USERNAME varchar(110)
Select * INTO #temptable
FROM
(
select a.CUser_id, b.User_Id, a.U_datetime
as REPORTDATE, ISNULL(b.first_Name, '') + ' ' + ISNULL(b.last_name, '') AS USERNAME
from inward_doc_tracking_trl a inner join user_mst b
on a.CUser_id = b.mkey
and a.U_datetime >= @As_ONDATE
) as x
DECLARE Cur_1 CURSOR
FOR SELECT CUser_id, User_Id FROM #temptable
OPEN Cur_1
DECLARE @CUser_id INT
DECLARE @User_Id INT
--DECLARE @USERNAME VARCHAR (100)
FETCH NEXT FROM Cur_1
INTO @CUser_id, @User_Id
WHILE (@@FETCH_STATUS = 0)
BEGIN
SELECT @REPORTDATE = U_datetime FROM inward_doc_tracking_trl
where U_datetime >= @As_ONDATE
SELECT @USERNAME = ISNULL(b.first_Name, '') + ' ' + ISNULL(b.last_name, '')
FROM inward_doc_tracking_trl a
INNER JOIN user_mst b on a.CUser_id = b.mkey
where a.U_datetime >= @As_ONDATE
UPDATE #temptable
SET REPORTDATE = @REPORTDATE,
USERNAME = @USERNAME
WHERE CUser_id = @CUser_id
AND User_Id = @User_Id
FETCH NEXT FROM Cur_1 INTO @CUser_id, @User_Id
END
CLOSE Cur_1
DEALLOCATE Cur_1
SELECT * FROM #temptable
DROP TABLE #temptable
END
首先注释初始 BEGIN
块中的 @USERNAME 声明
-- DECLARE @USERNAME varchar(110)
然后处理 USERNAME
的 NULL
值,就像在 SELECT * INTO
块中一样
ISNULL(b.first_Name, '') + ' ' + ISNULL(b.last_name, '') AS USERNAME
然后在CURSOR中添加@USERNAME
作为
DECLARE Cur_1 CURSOR
FOR SELECT CUser_id, User_Id, USERNAME FROM #temptable
OPEN Cur_1
DECLARE @CUser_id INT
DECLARE @User_Id INT
DECLARE @USERNAME VARCHAR (200) -- can set your required length
FETCH NEXT FROM Cur_1
INTO @CUser_id, @User_Id
那么 @USERNAME
就不会抛出 NULL
错误
更新:根据您的评论,我更新了答案:
所以你想根据U_datetime >= @As_ONDATE
条件得到@USERNAME
因此,使用您现有的代码并在 CURSOR 中再添加一个块,以便在 SELECT @REPORTDATE = U_datetime FROM inward_doc_tracking_trl where U_datetime >= @As_ONDATE
之后获取 @USERNAME
值
SELECT @USERNAME = ISNULL(b.first_Name, '') + ' ' + ISNULL(b.last_name, '') -- no need of column alias here
FROM inward_doc_tracking_trl a
INNER JOIN user_mst b on a.CUser_id = b.mkey
WHERE a.U_datetime >= @As_ONDATE
也许试试这个:
ALTER PROCEDURE [dbo].[UserReportData]
@As_ONDATE Datetime
AS
BEGIN
Select * INTO #temptable
FROM
(
select
a.CUser_id,
b.User_Id,
a.U_datetime as REPORTDATE,
ISNULL( b.first_Name + ' ' + b.last_name, 'NONAME' ) as USERNAME -- normally if one of the two is null then all of it is Null
from inward_doc_tracking_trl a inner join user_mst b
on a.CUser_id = b.mkey
and a.U_datetime >= @As_ONDATE
) as x
DECLARE @REPORTDATE datetime
-- moved out of the loop
SELECT @REPORTDATE = U_datetime
FROM inward_doc_tracking_trl
where U_datetime >= @As_ONDATE -- this might bring more than one rows I think ???????
DECLARE Cur_1 CURSOR FOR SELECT CUser_id, User_Id, USERNAME FROM #temptable
DECLARE @CUser_id INT
DECLARE @User_Id INT
DECLARE @USERNAME varchar(110)
OPEN Cur_1
FETCH NEXT FROM Cur_1 INTO @CUser_id, @User_Id, @USERNAME
WHILE (@@FETCH_STATUS = 0)
BEGIN
UPDATE #temptable SET
REPORTDATE = @REPORTDATE,
USERNAME = @USERNAME
WHERE
CUser_id = @CUser_id
AND User_Id = @User_Id
FETCH NEXT FROM Cur_1 INTO @CUser_id, @User_Id, @USERNAME
END
CLOSE Cur_1
DEALLOCATE Cur_1
SELECT * FROM #temptable
DROP TABLE #temptable
END
我有SP。执行时出现错误
Cannot insert the value NULL into column 'USERNAME', table 'tempdb.dbo.#temptable__________________________________________________________________________________________________________0000000002FD'; column does not allow nulls. UPDATE fails. The statement has been terminated.
下面是我的SP
ALTER PROCEDURE [dbo].[UserReportData]
@As_ONDATE Datetime
AS
BEGIN
DECLARE @REPORTDATE datetime
DECLARE @USERNAME varchar(110)
Select * INTO #temptable
FROM
(
select a.CUser_id, b.User_Id, a.U_datetime
as REPORTDATE, b.first_Name + ' ' + b.last_name as USERNAME
from inward_doc_tracking_trl a inner join user_mst b
on a.CUser_id = b.mkey
and a.U_datetime >= @As_ONDATE
) as x
DECLARE Cur_1 CURSOR
FOR SELECT CUser_id, User_Id FROM #temptable
OPEN Cur_1
DECLARE @CUser_id INT
DECLARE @User_Id INT
FETCH NEXT FROM Cur_1
INTO @CUser_id, @User_Id
WHILE (@@FETCH_STATUS = 0)
BEGIN
SELECT @REPORTDATE = U_datetime FROM inward_doc_tracking_trl
where U_datetime >= @As_ONDATE
UPDATE #temptable
SET REPORTDATE = @REPORTDATE,
USERNAME = @USERNAME
WHERE CUser_id = @CUser_id
AND User_Id = @User_Id
FETCH NEXT FROM Cur_1 INTO @CUser_id, @User_Id
END
CLOSE Cur_1
DEALLOCATE Cur_1
SELECT * FROM #temptable
DROP TABLE #temptable
END
更新程序
ALTER PROCEDURE [dbo].[UserReportData]
@As_ONDATE Datetime
AS
BEGIN
DECLARE @REPORTDATE datetime
DECLARE @USERNAME varchar(110)
Select * INTO #temptable
FROM
(
select a.CUser_id, b.User_Id, a.U_datetime
as REPORTDATE, ISNULL(b.first_Name, '') + ' ' + ISNULL(b.last_name, '') AS USERNAME
from inward_doc_tracking_trl a inner join user_mst b
on a.CUser_id = b.mkey
and a.U_datetime >= @As_ONDATE
) as x
DECLARE Cur_1 CURSOR
FOR SELECT CUser_id, User_Id FROM #temptable
OPEN Cur_1
DECLARE @CUser_id INT
DECLARE @User_Id INT
--DECLARE @USERNAME VARCHAR (100)
FETCH NEXT FROM Cur_1
INTO @CUser_id, @User_Id
WHILE (@@FETCH_STATUS = 0)
BEGIN
SELECT @REPORTDATE = U_datetime FROM inward_doc_tracking_trl
where U_datetime >= @As_ONDATE
SELECT @USERNAME = ISNULL(b.first_Name, '') + ' ' + ISNULL(b.last_name, '')
FROM inward_doc_tracking_trl a
INNER JOIN user_mst b on a.CUser_id = b.mkey
where a.U_datetime >= @As_ONDATE
UPDATE #temptable
SET REPORTDATE = @REPORTDATE,
USERNAME = @USERNAME
WHERE CUser_id = @CUser_id
AND User_Id = @User_Id
FETCH NEXT FROM Cur_1 INTO @CUser_id, @User_Id
END
CLOSE Cur_1
DEALLOCATE Cur_1
SELECT * FROM #temptable
DROP TABLE #temptable
END
首先注释初始 BEGIN
块中的 @USERNAME 声明
-- DECLARE @USERNAME varchar(110)
然后处理 USERNAME
的 NULL
值,就像在 SELECT * INTO
块中一样
ISNULL(b.first_Name, '') + ' ' + ISNULL(b.last_name, '') AS USERNAME
然后在CURSOR中添加@USERNAME
作为
DECLARE Cur_1 CURSOR
FOR SELECT CUser_id, User_Id, USERNAME FROM #temptable
OPEN Cur_1
DECLARE @CUser_id INT
DECLARE @User_Id INT
DECLARE @USERNAME VARCHAR (200) -- can set your required length
FETCH NEXT FROM Cur_1
INTO @CUser_id, @User_Id
那么 @USERNAME
就不会抛出 NULL
错误
更新:根据您的评论,我更新了答案:
所以你想根据U_datetime >= @As_ONDATE
条件得到@USERNAME
因此,使用您现有的代码并在 CURSOR 中再添加一个块,以便在 SELECT @REPORTDATE = U_datetime FROM inward_doc_tracking_trl where U_datetime >= @As_ONDATE
@USERNAME
值
SELECT @USERNAME = ISNULL(b.first_Name, '') + ' ' + ISNULL(b.last_name, '') -- no need of column alias here
FROM inward_doc_tracking_trl a
INNER JOIN user_mst b on a.CUser_id = b.mkey
WHERE a.U_datetime >= @As_ONDATE
也许试试这个:
ALTER PROCEDURE [dbo].[UserReportData]
@As_ONDATE Datetime
AS
BEGIN
Select * INTO #temptable
FROM
(
select
a.CUser_id,
b.User_Id,
a.U_datetime as REPORTDATE,
ISNULL( b.first_Name + ' ' + b.last_name, 'NONAME' ) as USERNAME -- normally if one of the two is null then all of it is Null
from inward_doc_tracking_trl a inner join user_mst b
on a.CUser_id = b.mkey
and a.U_datetime >= @As_ONDATE
) as x
DECLARE @REPORTDATE datetime
-- moved out of the loop
SELECT @REPORTDATE = U_datetime
FROM inward_doc_tracking_trl
where U_datetime >= @As_ONDATE -- this might bring more than one rows I think ???????
DECLARE Cur_1 CURSOR FOR SELECT CUser_id, User_Id, USERNAME FROM #temptable
DECLARE @CUser_id INT
DECLARE @User_Id INT
DECLARE @USERNAME varchar(110)
OPEN Cur_1
FETCH NEXT FROM Cur_1 INTO @CUser_id, @User_Id, @USERNAME
WHILE (@@FETCH_STATUS = 0)
BEGIN
UPDATE #temptable SET
REPORTDATE = @REPORTDATE,
USERNAME = @USERNAME
WHERE
CUser_id = @CUser_id
AND User_Id = @User_Id
FETCH NEXT FROM Cur_1 INTO @CUser_id, @User_Id, @USERNAME
END
CLOSE Cur_1
DEALLOCATE Cur_1
SELECT * FROM #temptable
DROP TABLE #temptable
END