2017-11-24 3 views
0

나는 varchar에 열 nvarchar의 모든 유형을 변경하고 ncharchar에 다음이 스크립트를 썼다 :액세스

SELECT DISTINCT 
    TABLE_NAME, COLUMN_NAME, DATA_TYPE 
INTO 
    #Temp 
FROM 
    DATA.INFORMATION_SCHEMA.COLUMNS 
WHERE 
    TABLE_SCHEMA IN ('SCHEMA1', 'SCHEMA2') 
    AND DATA_TYPE LIKE 'nvar%' 
    OR DATA_TYPE LIKE 'nch%' 

SELECT DISTINCT TABLE_NAME 
FROM #Temp 

WHILE (SELECT COUNT(*) FROM #Temp) > 0 
BEGIN 
    IF DATA_TYPE LIKE 'nvarchar' 
     ALTER TABLE_NAME 
      ALTER COLUMN_NAME CAST (COLUMN_NAME AS varchar) 
    ELSE IF DATA_TYPE LIKE 'nchar' 
     ALTER TABLE_NAME 
      ALTER COLUMN_NAME CAST (COLUMN_NAME AS char) 
    ELSE 
     DELETE #Temp 
END 

내 질문은 내가 Tempelement에 액세스 할 수있는 방법 때문에 항상 Foreach에 의해 수행되며 SQL Server에서이 루프에 액세스 할 수 없습니다.

많은 수의 테이블이 있고 확인하고 싶기 때문에 아직 스크립트를 실행하고 있지 않습니다.

아무도 내 loop while을 변경하여 Temp의 각 요소에 액세스하는 방법을 알려주십시오.

덕분에 많은

+3

왜 지구상에서 이것을 원하십니까?! – DavidG

+0

미안합니다. – vero

+1

nvarchars를 varchars로 변경 – Jamiec

답변

0

참조 마이크로 소프트 문서 https://docs.microsoft.com/en-us/sql/t-sql/language-elements/while-transact-sql 예를 들어 B - 커서로 잠시.

귀하의 테이블 변경 명령 ​​

가 작동하지 않습니다 - 당신이 문자열을 구축 한 다음 개발하는 동안 테스트 케이스를 공식화하려고 대신 스키마를 변경하는 것이 다음 단계 중 하나를 수행하기 전에 https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-executesql-transact-sql

를 사용해야합니다 이 해결책. 백업이 있는지 확인하십시오.

@DavidG - David가 맞습니다. 이렇게하면 데이터가 손실 될 수 있습니다. 조심해서 진행해라.