반응형

SQL서버에서 정수를 16진수로 변환하는 방법 입니다.

1. 정수를 16진수로 변경 하려면 BARBINARY 타입으로 CONVERT 한다 (SQL Server 2008 이상).

2. 16진수를 정수로 변경하려면 INT 타입으로 CONVERT 한다.
    단 16진수가 문자로 되어 있는 경우에는 VARBINARY로 CONVERT 한 후, 다시 INT 타입으로 CONVERT 한다.

-- 0x prefix가 있을 때:
SELECT CONVERT(INT, CONVERT(VARBINARY, '0x1FFFFF', 1)) 
-- 0x prefix가 없을 때:
SELECT CONVERT(INT, CONVERT(VARBINARY, '1FFFFF', 2))

3. 내장함수인 fn_varbintohexstr()를 사용 한다.

4. FORMAT() 함수를 이용 한다 (SQL Server 2012 이상).

반응형
반응형

2013년에 포스팅한 내용이 너무 간단한 것 같아서 좀 더 자세한 내용으로 다시 올립니다.

hackhyun.tistory.com/231

 

[SQL서버] PK(Primary Key) 변경 하기

SQL서버에서 기존의 PK를 다른 컬럼 구성으로 변경 하려면 다음과 같이 한다. -- 기존 PK명 확인 sp_help 테이블명 --기존 PK 삭제 ALTER TABLE 테이블명 DROP CONSTRAINT 기존_PK명 --새로운 PK 정의 ALTER TABLE..

hackhyun.tistory.com

SQL서버에서 기존의 PK로 사용된 컬럼을 다른 컬럼으로 변경하려면 다음과 같이 합니다.

1. 기존 PK 명(인덱스 명) 확인

sp_helpindex 테이블명
  • primary key로 지정된 인덱스 명을 확인 합니다.

2. 기존 PK 삭제

ALTER TABLE 테이블명
DROP CONSTRAINT 기존_PK명
  • 1에서 확인된 인덱스 명을 이용합니다.

3. 새로운 PK 정의

ALTER TABLE 테이블명
ADD CONSTRAINT 새_PK명 
PRIMARY KEY [NONCLUSTERED](컬럼1, 컬럼2, ...)
  • 새 PK에 포함될 컬럼은 NULL이 허용되지 않는 컬럼이어야 합니다.
  • 별도로 지정하지 않으면 PK 컬럼이 클러스터 인덱스로 생성됩니다.
  • PK가 아닌 다른 컬럼을 클러스터 인덱스로 사용할 계획이라면 NONCLUSTERED 옵션을 지정합니다.

4. 잘 변경되었는지 확인

 

반응형
반응형

SSMS 18.3 버전 부터 쿼리를 실행 하고나면 항상 완료시간이 표시 됩니다.

특별히 도움 되지는 않고 귀찮기만 한 경우에는 다음 옵션에서 체크를 해제 하면 됩니다.

도구 > 옵션 > 쿼리 실행 > SQL Server > 고급 

SSMS를 재시작하면 더 이상 완료 시간이 표시되지 않습니다.
반응형
반응형

원격지 서버의 테이블에 대한 갱신 작업을 위해서 다음과 같이 Linked Server의 테이블을 JOIN 하여 UPDATE 하였습니다.

SET XACT_ABORT ON;

DECLARE @ano VARCHAR(30) = 'S201910250010'

BEGIN DISTRIBUTED TRAN

UPDATE Trgt
SET
    AcptYn = 'N',
    AcptEmpCode = '', 
    AcptDeptCode = '',
    AcptDateTime = NULL
FROM
    RemoteServer.RemoteDB.dbo.FIAccSlipDisappMaster AS Trgt
        JOIN RemoteServer.RemoteDB.dbo.FIAccSlipAggreationNo AS A
            ON a.SlipNo = Trgt.SlipNo
            AND A.AggregationNo = @ano

SET XACT_ABORT OFF;

COMMIT

그러나 동작은 잘 되지만 성능이 너무 나오지 않았습니다.

실행계획을 보니 원격지 테이블을 모두 읽어와서 JOIN 시키다 보니 실제 UPDATE 시킬 행은 1개 인데 수십만 건의 데이터를 읽고 있었습니다.

그래서 OpenQuery로 변경 하려고 했으나, 문제는 OpenQuery의 SQL문이 순수한 문자열만 가능 하도록 되어 있어서 파라미터(변수)를 사용할 수가 없었습니다.

SET XACT_ABORT ON;

DECLARE @ano VARCHAR(30) = 'S201910250010'

BEGIN DISTRIBUTED TRAN

UPDATE x
SET
    AcptYn = ''N'',
    AcptEmpCode = '''', 
    AcptDeptCode = '''',
    AcptDateTime = NULL
FROM
    OpenQuery (RemoteServer,
        '
        SELECT
            Trgt.*
        FROM RemoteDB.dbo.FIAccSlipAggreationNo AS A
            JOIN RemoteDB.dbo.FIAccSlipDisappMaster AS Trgt
                ON a.SlipNo = Trgt.SlipNo
        WHERE
            A.AggregationNo = ''' + @ano + '''
        '
    ) x

SET XACT_ABORT OFF;

COMMIT

그래서 최종적으로 OpenQuery를 포함한 전체 쿼리 문장을 문자열 변수에 넣고 EXEC()로 처리 하였습니다.

SET XACT_ABORT ON;

DECLARE @ano VARCHAR(30) = 'S201910250010'
DECLARE @sql varchar(max)

BEGIN DISTRIBUTED TRAN

set @sql = 
    '
    UPDATE x
    SET
        AcptYn = ''N'',
        AcptEmpCode = '''', 
        AcptDeptCode = '''',
        AcptDateTime = NULL
    FROM
        OpenQuery (RemoteServer,
            ''
            SELECT
                Trgt.*
            FROM RemoteDB.dbo.FIAccSlipAggreationNo AS A
                JOIN RemoteDB.dbo.FIAccSlipDisappMaster AS Trgt
                    ON a.SlipNo = Trgt.SlipNo
            WHERE
                A.AggregationNo = ''''' + @ano + '''''
            ''
        ) x
    '
EXEC(@sql)

SET XACT_ABORT OFF;

COMMIT

성능도 좋고, 파라미터(변수)도 처리할 수 있어서 만족할 만한 결과가 나왔습니다.
원격지 서버에 대한 갱신작업이 필요하실 때 참고 하시기 바랍니다.

반응형

+ Recent posts