어제는 데이터베이스가 동기화되지 않아 답답했습니다. 개발 및 테스트에 사용되는 라이브러리가 동일하지 않아 저장 프로시저가 자주 업데이트됩니다. 때로는 테이블 구조도 변경됩니다.
이로 인해 많은 문제가 발생합니다. 한동안 나는 구체적인 문제가 무엇인지 몰랐기 때문에 매우 당황스러웠습니다. 갑자기 두 라이브러리의 차이점을 비교하여 테스트와 구현을 용이하게 하는 프로그램을 작성하고 싶었습니다.
오늘 아침 회의를 하면서 글을 쓰다가 정오에
주로 두 개의 SQL 문에 대한
테스트를 통과했습니다.
쿼리 라이브러리에서 서로 다른 테이블 및 뷰 구조와 열 속성을 갖는 SQL은 다음과 같습니다.
TableName으로 A. [name]을 선택하고,
B. [이름] Colname으로,
B.xtype,
B.x사용자 유형,
B. 길이,
비콜리드,
B.c기본값,
B.도메인,
B.번호,
B.오프셋,
B.상태,
B. 유형,
B.사용자 유형,
B.prec,
B.스케일,
B. 계산됨,
B.isoutparam,
B.무효화 가능,
C.COLUMN_DEFAULT,
dbo.fnIsColumnPrimaryKey(B. [ID], B. [이름]) as PKey
sysobjects A, syscolumns B, INFORMATION_SCHEMA .COLUMNS C에서
여기서 a.id = B.id
및 A.xtype('u', 'v')
A. 이름 = C.TABLE_NAME
B. 이름 = C.COLUMN_NAME
A. [ID], B. [이름] 순으로
///////
각 컬럼의 의미는 다음과 같습니다.
name sysname 열 이름 또는 프로시저 매개변수의 이름입니다.
id int 이 열이 속한 테이블 개체 ID 또는 이 매개 변수와 연결된 저장 프로시저 ID입니다.
xtypetinint systypes의 물리적 저장 유형입니다.
typestattinyint 내부 전용입니다.
xusertype smallint 확장된 사용자 정의 데이터 유형 ID입니다.
length smallint systypes의 최대 물리적 저장 길이입니다.
xprectinint 내부 전용입니다.
xscaletinint 내부 전용입니다.
colid smallint 열 또는 매개변수 ID입니다.
xoffset smallint 내부 전용입니다.
bitpos Tinint 내부 전용입니다.
예약된tinyint 내부 전용입니다.
colstat smallint 내부 전용입니다.
cdefault int 이 열의 기본값 ID입니다.
domain int 이 열의 규칙 또는 CHECK 제약 조건 ID입니다.
number smallint 프로세스가 그룹화될 때 하위 프로세스 번호입니다(0은 프로세스가 아닌 항목을 나타냄).
colorder smallint 내부 전용입니다.
autoval varbinary(255) 내부 전용입니다.
offset smallint 이 열이 있는 행의 오프셋입니다. 음수인 경우 가변 길이 행을 나타냅니다.
statustinyint 열 또는 매개변수 속성을 설명하는 비트맵:
0x08 = 열은 Null 값을 허용합니다.
0x10 = varchar 또는 varbinary 열을 추가할 때 ANSI 패딩이 적용됩니다. varchar 열의 후행 공백과 varbinary 열의 후행 0을 유지합니다.
0x40 = 매개변수가 OUTPUT 매개변수입니다.
0x80 = 열이 ID 열입니다.
typetintint systypes의 물리적 저장소 유형입니다.
usertype smallint systypes의 사용자 정의 데이터 유형 ID입니다.
printfmt varchar(255) 내부 전용입니다.
prec smallint 이 열의 정밀도 수준입니다.
scale int 이 열의 소수 자릿수입니다.
iscomputed int 열이 계산되었는지 여부를 나타내는 플래그:
0 = 계산되지 않음.
1 = 계산됨.
isoutparam int는 프로시저 매개변수가 출력 매개변수인지 여부를 나타냅니다.
1 = 사실입니다.
0 = 거짓.
isnullable int는 열이 Null 값을 허용하는지 여부를 나타냅니다.
1 = 사실입니다.
0 = 거짓.
COLUMN_DEFAULT 기본값
PKey 기본 키.
////////
다음 기능이 사용됩니다:
-------------
함수 만들기 dbo.fnIsColumnPrimaryKey(@sTableID int, @nColumnName varchar(128))
--alter 함수 dbo.fnIsColumnPrimaryKey(@sTableName varchar(128), @nColumnName varchar(128))
반환 비트
처럼
시작하다
@nTableID int 선언,
@nIndexID 정수,
@i 정수
SET @nTableID = @sTableID--OBJECT_ID(@sTableName)
SELECT @nIndexID = 인디드
sysindexes에서
어디에서 id = @nTableID
AND 1과 254 사이
AND(상태 및 2048) = 2048
@nIndexID가 Null인 경우
0을 반환
IF @nColumnName IN
(SELECT sc.[이름]
sysindexkeys에서
내부 조인 syscolumns sc ON sik.id = sc.id AND sik.colid = sc.colid
어디에서 sik.id = @nTableID
AND sik.indid = @nIndexID)
시작하다
반환 1
종료
반환 0
끝
-------------
이 SQL 문을 통해 데이터베이스의 모든 테이블의 컬럼 속성을 확인할 수 있습니다.
이 SQL 문을 각각 두 번 실행하면 두 라이브러리에 있는 열의 속성을 검색하고 비교할 수 있습니다.
------------------------------------- ---------------
저장 프로시저 및 함수의 경우 다음 SQL 문을 사용합니다.
xtype이 ('P','TF','IF','FN')인 sysobjects에서 *를 [이름]별로 선택하세요.
모든 저장 프로시저 및 함수 이름을 쿼리할 수 있습니다. 루프 쿼리 결과,
각 루프에서 함수 또는 저장 프로시저 이름은 문자열 SpobjectName에 저장된 다음 저장 프로시저가 호출됩니다. sp_helptext는 다음과 같습니다.
exec sp_helptext '" +SpobjectName+"'
SpobjectName 저장 프로시저의 텍스트 콘텐츠가 포함된 테이블을 반환합니다. 저장 프로시저의 텍스트 행 하나는 테이블의 행 하나에 해당합니다.
exec sp_helptext를 사용하여 모든 SP 및 함수를 실행하여 모든 저장 프로시저 및 함수의 코드를 가져옵니다.
결과를 표에 표시하고 유사점과 차이점을 비교해 보세요.
참조: SQL Server 온라인 설명서
<데이터베이스의 저장 프로시저 자동 생성>( http://www.vckbase.com/document/viewdoc/?id=1111 )
이제는 테이블과 뷰, 저장 프로시저와 함수의 열 속성만 비교합니다.
비교 테이블 간의 제약 관계는 구현되지 않습니다.
나중에 추가될 예정입니다.