안녕하세요.,.. 지난번에 왔던 게임개발하는 서버프로그래머입니다 ㅎㅎ...
지난번 질문에서도 많은 도움을 받아서 오늘도 한번 도움을 요청하고자 글을 올립니다..
저번보단 쉬운 내용인거 같은데요...
문자열 배열로 UID들을 받아서 해당 UID들의 데이터를 update시키는데 계속 버그가 발생하네요.
도움을 요청합니다..
CREATE PROCEDURE [dbo].[spMailDeleteAll]
@charUID bigint
, @MailUIDList nvarchar(3000)
AS
BEGIN TRY
SET NOCOUNT ON
--DECLARE @NVARCHARTRANS varchar(3000)
--set @NVARCHARTRANS = CONVERT(varchar(3000),@MailUIDList)
DECLARE @SQL nvarchar(3600)
set @SQL = 'update tbMailBox set IsActivate = 0, Deleted_Date = getdate() where ReciverCharUID = @charUID and MailUID IN ('+ @MailUIDList +')'
EXEC(@SQL) -- 요기서 에러 발생합니다 ㅠㅠ;
return 0
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRAN;
return 100
END CATCH
주석처리된 부분을 보시면 아시겠지만 varchar로도 해보고 nvarchar로도 해보고 안되서 화가나서
update tbMailBox set IsActivate = 0, Deleted_Date = getdate() where ReciverCharUID = @charUID and MailUID IN ( 실제UID )
이 구문으로 직접 실행시켜보니 잘되더라구요..
결국 문제는 UID 리스트를 sql문에 넣는 부분이 문제인거 같은데... 어떤부분이 문제일지 잘 모르겠습니다;;
도움을 보탁드립니다
Comment 4
-
남중남고군대공대
2020.06.15 11:09
-
남중남고군대공대
2020.06.15 11:30
아 물론 EXECUTE sp_executesql @SQL 이것도 테스트 해보고 드리는 질문입니다 ㅎㅎ;;;; 둘다 안되용......
-
남중남고군대공대
2020.06.15 14:13
핳하... 질문 업데이트 합니다...
CREATE PROCEDURE [dbo].[spMailDeleteAll]
@charUID bigint
, @MailUIDList nvarchar(3000)
AS
BEGIN TRY
SET NOCOUNT ON
--DECLARE @NVARCHARTRANS varchar(3000)
--set @NVARCHARTRANS = CONVERT(varchar(3000),@MailUIDList)
DECLARE @SQL nvarchar(3600)
DECLARE @SQL_Param NVARCHAR(1000)
set @SQL = 'update tbMailBox set IsActivate = 0, Deleted_Date = getdate() where MailUID IN ('+ @MailUIDList +') and ReciverCharUID = @p_charUID'
set @SQL_PARAM = '@p_charUID bigint'
EXECUTE sp_executesql @SQL , @SQL_PARAM , @p_charUID = @charUID
return 0
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRAN;
return 100
END CATCH
이렇게 바꿔서 해결했습니다.
멍청하게 @sql 쪽에다가 매개변수 파라메터를 안넣어줬더라구요.
근대 싱기하게도 SSDT 내부에서 쿼리문에 직접 실행 명령문 넣고 실행하면 이상이 없는데
실제 서버에 적용시키니까 서버내부 EXECUTE 문에서 갑자기 물리더니 놔주질 않더라구요. ㅎㅎㅎ.....
여기부터는 제가 짜논 로직이나 혹은 ADO 문제 일거 같은데 스스로 답을 찾아봐야 할거 같네요
괜히 댓글만 많이 남기고 자기 혼자 글 끄적이다가 마무리 되는 느낌이라 죄송합니다
즐거운 코딩 되시기바랍니다;
-
지영아빠
2020.06.18 15:16
제일 위에서 에러난다고 하신 부분은
set @SQL = 'update tbMailBox set IsActivate = 0, Deleted_Date = getdate() where ReciverCharUID = ' + cast(@charUID as nvarchar) + ' and MailUID IN ('+ @MailUIDList +')'
이렇게 수정하시면 될듯.3번째 올리신 업데이트된 쿼리문에서는...
exec면 ....
set @SQL = 'update tbMailBox set IsActivate = 0, Deleted_Date = getdate() where MailUID IN ('+ @MailUIDList +') and ReciverCharUID = ' + cast(@p_charUID as nvarchar)
exec(@sql)
sp_executesql이면..
set @SQL = N'update tbMailBox set IsActivate = 0, Deleted_Date = getdate() where MailUID IN ('+ @MailUIDList + N') and ReciverCharUID = @p_charUID'
set @SQL_PARAM = N'@p_charUID bigint'
EXECUTE sp_executesql @SQL , @SQL_PARAM , @p_charUID = @charUID
이런 식일듯..
프로파일러로 쿼리문 따봤을땐
exec spMailDeleteAll
4,N'1546,1547,1548,1549,1550,1551,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,1563,1564,1565' 요런식으로 나왔습니다