쿼리를 짜다 보면 셀랙트된 결과 테이블을 이용하여 저장 프로시저를 호출한다거나 각 데이터(Row)에 따른 다른 처리가 필요할 때가 있습니다. 예를 들면 '사원1'의 영업실적을 상위 상관들에게 누적하기 위한 저장 프로시저가 있다면 영업사원 숫자만큼 저장 프로시저를 호출해야 하죠. 이런 행단위 처리를 할 때 사용하는 것이 '커서(cursor)'입니다. (참고 : 커서(SQL Server Compact Edition)) 1. 커서의 이해 MSDN을 보면 눈이 돌아갈 정도입니다-_-;; 지금 당장 우리에게 필요한 건 단순히 "검색된 결과 테이블의 행만큼 저장 프로시저를 호출하고 싶다." 입니다. 커서는 이름처럼 데이터 자체를 조작하는 역활이 아닌 데이터의 위치를 알려주는 역활입니다. 그렇기 때문에 다음 칸의 데..
자주 있는 일은 아니지만 가끔 저장프로시저나 테이블 같은 것들을 쿼리로 파악해야 하는 경우가 있습니다. 보고서를 만든다거나 문서같은 것을 만들때 말이죠, 이때 사용하는 것이 'sys.objects'입니다. (참고 : MSDN - sys.objects(Transact-SQL)) 1. 'sys.objects' 사용하기 'sys.objects'를 테이블 처럼 이용하여 쿼리를 사용할 수 있습니다. Select name From sys.objects Where type = 'U' 이런 식으로 말이죠. 2. 'type' 종류 위에 코드에서 보시면 아시겠지만 이 코드에서 중요한건 'type'입니다, 이미 MSDN을 보셨다면 알고 계시겠죠? ㅎㅎㅎ 개체 유형: AF 집계 합수 (CLR) C CHECK 제약 조건 D D..
varchar와 nvarchar의 차이를 알아봅시다. 아래 코드는 테스트에 사용한 테이블을 생성하는 코드입니다. CREATE TABLE [dbo].[tb_Test_nvarchar]( [id] [int] IDENTITY(1,1) NOT NULL, [test1] [nvarchar](32) NULL ) ON [PRIMARY] GO CREATE TABLE [dbo].[tb_Test_varchar]( [id] [int] IDENTITY(1,1) NOT NULL, [test2] [varchar](32) NULL ) ON [PRIMARY] GO CREATE TABLE [dbo].[tb_Test_varchar64]( [id] [int] IDENTITY(1,1) NOT NULL, [test3] [varchar](64) ..
MSSQL에서 백업한 파일을 복구하려고 할 때 나는 에러 입니다. 1. 에러 발생 백업된 DB좀 확인해달라고 해서 .bak파일을 받아서 복원을 돌려보니... 미디어 세트에 2개의 미디어 패밀리가 있지만 1개만 제공하고 있습니다. 모든 멤버를 제공해야 합니다. 라는 오류가 떴습니다. 이 오류는 백업파일을 만들때 2개의 파일이 생성됬는데 1개만 지정했다고 나는 오류 입니다. 2. 필요한 백업파일 숫자 확인 해당 백업파일이 몇개있어야 하는지는 'Restore Labelonly'라는 쿼리로 알수 있습니다. --파일이 한개인 경우 Restore Labelonly From Disk='[파일위치]' 이렇게 하면 아래와 같이 파일갯수가 나옵니다. (FamilyCount가 갯수임) 이렇게 나오면 복원할때 파일이 2개가 ..
서버에 설치된 MSSQL버전을 확인일 이 있어 도움말에 정보를 보니.... 오마이갓..... 도움말 > 정보 의 내용이 이렇게 부실한지 처음 알았네요-_-;; 이 서버에 설치된 MSSQL버전이 MSSQL 2008 Express 버전인데 해당 버전에 대한 아무런 정보도 없습니다 -_-;;;; 마이크로 소프트 고갯센터에 검색을 해보니 다행이 해당 내용이 있군요. (참고 : Microsoft 고객센터 - SQL Server 버전과 에디션을 확인하는 방법) 버전별로 확인 하는 쿼리가 있습니다. 하지만 모두 똑같다는거 ㅋㅋㅋㅋ SELECT SERVERPROPERTY('productversion'), SERVERPROPERTY ('productlevel'), SERVERPROPERTY ('edition') 참고 :..
저장 프로시저(stored procedure) 안에서 다른 저장 프로시저를 호출하려면 크게 보자면 2가지 방법이 있습니다. Exec(EXECUTE)나 sp_executesql를 이용하면 됩니다. ( 참고 : MSDN - sp_executesql 사용) 여기서는 Exec(EXECUTE)를 이용하는 방법을 설명하겠습니다. 1. 리턴값이 없을 때 리턴값이 없으면 그냥 호출하면 됩니다. --Exec [저장프로시저 이름] --Exec [저장프로시저 이름] [매개변수1],[매개변수2],.... Exec TestSelect @temp 2. 리턴값이 있을 때 리턴값은 항상 int형이므로 인티저형의 변수를 하나 선언한 후 값을 대입하는 방식으로 받습니다. --Exec [값을 받을 변수] = [저장프로시저 이름] [매개변..
사용하던 테이블의 이름이 갑자기 변경되는 바람에 연결되있던 저장프로시저를 변경해야할 일이 생겼습니다. 문제는 이미 만들어진 저장프로시저가 너무 많다는게-_-;;; 일부가 이만큼-_-; 저장프로시저양에 정신적 크리를 먹고 해롱대던중 예전에 DBA가 저장 프로시저 검색할때 쓰라고준 쿼리가 생각나 있어 찾아보니 다행이 있군요 ㅋㅋㅋㅋ Select A.* From sys.sysobjects A Inner Join sys.syscomments B ON A.id = B.id Where A.xtype = 'P' And A.category = 0 And B.text Like '%검색어%' %GameList%가 포함된 모든 저장프로시저가 검색됬군요.
서버 라이센스 문제때문에 호스팅업체와 이야기 하던중 "그러면 MSSQL2008은 익스프래스(Express)버전 쓰시죠?" 아항!!!! 완전이 까먹고 있었지만 MSSQL2008 Express버전은 무료입니다. (참고 : Microsoft Download Center - Microsoft SQL Server 2008 R2 RTM - Express with Management Tools, 다른 툴들도 깔아야 함 - Microsoft SQL Server 2008 express 관련 다운로드 ) 물론 내부개발 및 테스트용으로만 무료입니다. 기존 엔터프라이즈(Enterprise) 버전과 무슨차이가 있는지 찾아 보았습니다. 참고 : SQL Server 2008 R2 버전에서 지원하는 기능(Features Suppor..
뭐...당연한 이야기지만 저장프로시저에서 반복문 사용하는건 심각한 문제입니다 ㅡ.-;; 저장프로시저 안에서 반복문을 사용하는 것보다 프로그램에서 저장프로시저를 반복하여 호출하는 방식을 많이 사용하는데 어느것이 더 효율적인지는 모르겠습니다. 상황에 따라서 성능차가 있겠지만 일반적인 서버구성으로 볼때 디비에서 반복문이 돌아가는것 보다 프로그램에서 돌아가는것이 유리하긴 하죠. 그래도 이방법저방법 다 안될때는 결국 써야 하니 알아봅시다 ㅎㅎ While @nI < 10 Begin Insert Into tb_Test(nData) Values( @nI) Set @nI = @nI + 1 End 일반적인 While문의 형태를 하고 있습니다. 덕분에 제가 설명할 것이 없네요 ㅋㅋㅋ While로 시작하여 범위를 지정해주시면..
간만에 MSSQL의 포트를 바꿨는데.....맨날 기본포트쓰다가 커스텀 포트를 쓰니 연결문자열에 포트를 못넣어서 삽질을 ㅡ,.ㅡ; 어찌됬건 MSSQL의 연결문자열에서 포트(Port)는 콤마 입니다. 주소다음에 콤마를 넣어야 하죠. //커낵션 생성 msConn = new SqlConnection(); msConn.ConnectionString = "Server=주소,포트;DataBase=\"해당DB\";UId=\"로그인ID\";pwd=\"로그인 비밀번호\""; 요렇게 말이죠. MSSQL 연결 문자열 키워드에 대한 자세한 내용은 MSDN에서 확인 할수 있습니다. MSDN - SQL Server Native Client에서 연결 문자열 키워드 사용