안녕하세요. 게임 회사 다니는 서버 프로그래머입니다.
그리고 익히 아시다시피들... 중소게임회사는 개발단계에서 DBA를 잘 고용하지 않아여...
물론... 게임 DB가 그리 복잡하지 않을 순 있지만...
c종류만 나름 열심히 했던 저에게 큰 시련이네요...
서론이 길었습니다.
게임에서 우편 구현중입니다.
첨부물품 모두 받기를 제작중이죠. 우편함 내 모든 우편들의 첨부물품 싹다 받는겁니다.
하나의 우편에서 첨부물품 받기는 완성했습죠
그럼 그걸 반복하면 되는거 아닌가요? 라고 할 수도 있지만
성능 떨어지니 원쿼리로 해결보라 하십니다...
그래서 메일 리스트를 스토어드 프로시저에 전달해서
리스트를 분해해서 스토어드 프로시저 내부(첨부물품 모두받기 sp)에서
스토어드 프로시저(우편하나 첨부물품 받기)를 호출 시키려고 합니다..
사실 경험이 없던지라 동적 쿼리 처럼 사용하면 되지 않을까 했는데 열심히 캐치 잡아 내내요...
이게 가능한지 여부나 알고 싶어서 ㅠㅠ
정통 dba님들의 가르침 기다리겠습니다
아래는 소스입니다.
CREATE PROCEDURE [dbo].[spMailUnpackAttachAll]
@CharUID bigint,
@MailUIDList nvarchar(3000)
AS
BEGIN TRY
BEGIN TRAN
DECLARE @ProcessFlag tinyint
DECLARE @RecvCharUID bigint
DECLARE @INPUTMAILUID bigint
DECLARE @UIDTOTALCOUNT int
DECLARE @UIDCURRENTCOUNT int
DECLARE @strQuery nvarchar(256)
DECLARE @TmpMailList table
(
MailCOUNT int IDENTITY(0,1),
MailUIDs bigint
)
DECLARE @OrderID varchar(10), @Pos int
SET @MailUIDList = LTRIM(RTRIM(@MailUIDList))+ ','
SET @Pos = CHARINDEX(',', @MailUIDList, 1)
IF REPLACE(@MailUIDList, ',', '') <> ''
BEGIN
WHILE @Pos > 0
BEGIN
SET @OrderID = LTRIM(RTRIM(LEFT(@MailUIDList, @Pos - 1)))
IF @OrderID <> ''
BEGIN
INSERT INTO @TmpMailList (MailUIDs) VALUES (CAST(@OrderID AS bigint)) --Use Appropriate conversion
END
SET @MailUIDList = RIGHT(@MailUIDList, LEN(@MailUIDList) - @Pos)
SET @Pos = CHARINDEX(',', @MailUIDList, 1)
END
END
SET @UIDCURRENTCOUNT = 0
SELECT @UIDTOTALCOUNT = COUNT(MailCOUNT) FROM @TmpMailList
WHILE (@UIDCURRENTCOUNT <= @UIDTOTALCOUNT)
BEGIN
SET @INPUTMAILUID = (SELECT MailUIDs FROM @TmpMailList where MailCOUNT = @UIDCURRENTCOUNT)
SET @strQuery = 'exec spMailUnpackAttach ' --요기서 문제.
SET @strQuery += Cast(@INPUTMAILUID AS nvarchar)
EXECUTE sp_executesql @strQuery
END
COMMIT TRAN
return 0
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRAN;
return 100
END CATCH
문제가 되는 프로시져를 올리면 더 볼 수 있겠지만
올려놓은 프로시져의 본문도 대략 이런식으로 바꾸면 더 짧아질듯하네요
declare @s varchar(4000) = ''
declare cur cursor for
select 'exec spMailUnpackAttach N''' + value + '''' as _sql from string_split('aaa,bbb,ccc', ',')
open cur
fetch next from cur into @s
while @@fetch_status = 0 begin
EXECUTE sp_executesql @s
fetch next from cur into @s
end
close cur
deallocate cur