물고기 말고 낚시대를 만들자 !
TODAY 159 TOTAL 996,307
mssql (4)
mssql - while문을 이용한 구구단

-----------구구단 전체--------------
Declare 
@a		int, 
@b		int, 
@99dan	int

SET @b	= 2
SET @99dan = 2

Print '구구단 시작'

While @99dan < 10
Begin
	set @a = 1

	while @a < 10
	begin
		print str(@b) + ' x ' + str(@a) + ' = ' + str(@b*@a)
		set @a = @a + 1
	end

	print ''
	SET @99dan = @99dan + 1
	SET @b = @b + 1
End 

Print '구구단 끝'


0  Comments,   0  Trackbacks
댓글 쓰기
mssq에서 exec로 결과값 출력하기(output)

 

-- 프로시저 생성구문 
CREATE PROCEDURE 프로시저名
 @SiteCD varchar(10)   
 @result int output 
AS 
SET NOCOUNT ON 

...

중간생략

...

 

 

위와 같이 프로시저를 생성 후,

결과 값을 확인하고 싶을 경우가 생기는데,

exec 프로시저名 '변수값' , ''

이렇게 확인을 하면,

'명령이 완료되었습니다.' 라고만 나오고,

무슨 값이 출력되는지 알 수가 없다..

 

이럴 경우에

확인할 Output 값을 미리 설정후에

아래와 같이 실행시키면,

 

Declare
@result int
exec 프로시저名 '변수값' , @result output
print @result

 

이런 식으로 실행하면,

결과 값이 화면에 출력되어 어떤 값을 반환했는지 바로 확인 가능하다..

 

0  Comments,   0  Trackbacks
댓글 쓰기
데이터 형식 int(으)로 변환하는 중 산술 오버플로 오류가 발생했습니다.


분명 int형이 아닌 varchar형으로 값을 받아왔는데도 불구하고,
프로시저를 실행시켰을 때,
데이터 형식 int(으)로 변환하는 중 산술 오버플로 오류가 발생했습니다.
라는 오류가 발생하여 며칠을 고생했다..

간단하게 표현하면 다음과 같은 로직..

Create   PROCEDURE [dbo].[프로시저 명]          
  @start VARCHAR(255),
  @end VARCHAR(255)               -- 시작 값과 끝 값을 varchar로 받는다..

while (@start <= @end)             --시작 값이 마지막 값과 같아질 때까지 돌자.
     Insert into 테이블명 (시작값 )
               values   (@start )      --지정한 테이블에 시작 값 입력..
    Set @start = @start + 1        --시작 값에 +1 추가


이런식으로 아무 문제없이 작동하던 프로시저가 난관에 봉착..
받아와야 하는 시작 값이  24136965000, 마지막 값이 24136965010 이 되자,
데이터 형식 int(으)로 변환하는 중 산술 오버플로 오류가 발생했습니다.
라는 오류를 뱉어내는 것이다..

DB에서 실행하면 그나마 중지라도 시키지..
웹상에서 실행되면 무한으로 돌며 중지도 안되고,
결국, 실 DB서버 CPU를 100%를 만들어버리는 어처구니 없는 일이 발생..

뭐지? 뭐지? 난 int형을 받지 않았는데??

그래서 먼저 int형에 대해 확인 했다..
- 2147483648 ~ 2147483647 (int형의 범위)

내가 등록하려는 값이 int형 범위를 벗어나긴 했다..
그래? 그럼 Bigint 형 쓰면 깔끔하게 해결되네..?
맞다.. 헌데, 받아오는 값이 '0'으로 시작할 때가 있어서 이것도 답이 되진 못했고..

암튼, 이런저런 삽질을 하다가
Set @start = @start + 1 -> 이 구문을 다음과 같이 변경..
Set @start = convert(bigint, @start) + 1

미션 해결..

아직도 varchar로 받은 값이 while 문을 돌며 int형으로 잡히는지 모르겠지만,
이런식의 해결도 있으니 참고하면 좋을 듯..

0  Comments,   0  Trackbacks
댓글 쓰기
MySql에서 MsSql로 디비이전할 때 날짜 변환..


MySql에서 덤프를 받아보면 날짜부분이
'1087445413' 이런 식으로 숫자가 나열되어있다..
이유는
MySQL에서 사용하는 Unix Time 자료형은 1970년 1월 1일부터의 시간을 초단위로 표현한 형태라고 한다..

따라서,
아래와 같이 select 해주면
select DATEADD(second, 1087445413,'1970-01-01')

2004-06-20 12:44:51.000
위와같이 변환되어 보인다..

위 내용을 알고 테이블에 전부 집어 넣고 select 해보면
select DATEADD(second, signdate[날짜컬럼이 들어감],'1970-01-01')
from 테이블명

'dateadd 함수의 인수 2에 대한 인수 데이터 형식 varchar이(가) 잘못되었습니다.'
위와같은 에러문구가 떠서 난감하게 만든다..

이럴 땐!
아래와 같이 int 형으로 convert 해주자..
select DATEADD(second, convert(int, signdate[날짜컬럼이 들어감]),'1970-01-01')
from 테이블명
(second는 줄여서 s로 써도 됨)


2  Comments,   0  Trackbacks
댓글 쓰기
최근 작성 댓글
최근 작성 트랙백
글 보관함
캘린더
«   2018/01   »
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
검색