SnowConvert AI - SQL Server-Azure Synapse 문제¶
Applies to
SQL 서버
Azure Synapse Analytics
Sybase
SSC-EWI-TS0001¶
사용자 정의 함수 본문이 생성되지 않습니다
심각도¶
중요
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
설명¶
이 EWI는 SnowConvert AI가 변환 중에 함수 본문이 생성되지 못하게 하는 중요한 예외를 처리할 때 표시됩니다.
코드 예시¶
SQL 서버¶
CREATE FUNCTION func1 ()
RETURNS VARCHAR
SELECT
*
FROM
TABLE1
Snowflake¶
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "TABLE1" **
CREATE OR REPLACE FUNCTION func1 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "transact", "convertedOn": "07/14/2025", "domain": "no-domain-provided" }}'
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0001 - THE BODY WAS NOT GENERATED FOR FUNCTION 'func1' ***/!!!
AS
$$
$$;
모범 사례¶
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-EWI-TS0002¶
ANSI_PADDING OFF는 Snowflake에서 지원되지 않습니다.
심각도¶
낮음
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
설명¶
Transact-SQL에서 SET ANSI_PADDING OFF 문은 문자 데이터 타입의 삽입에서 후행 공백을 제거합니다. SET ANSI_PADDING OFF는 Snowflake에서 직접 구성할 수 있는 설정이 아니므로 SnowConvert AI는 이 EWI를 생성합니다.
코드 예시¶
SQL 서버¶
SET ANSI_PADDING OFF;
Snowflake¶
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0002 - THE ANSI_PADDING OFF IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
SET ANSI_PADDING OFF;
모범 사례¶
이 문제를 제거하려면 ETL 코드를 포함하여
RTRIM을 모든CHAR()데이터 타입 삽입에 추가합니다.추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-EWI-TS0003¶
ANSI_WARNINGS OFF는 Snowflake에서 지원되지 않습니다.
심각도¶
낮음
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
설명¶
Transact-SQL에서 SET ANSI_WARNINGS OFF 문은 0으로 나누기 또는 산술 오버플로와 같은 경고를 비활성화합니다. SET ANSI_WARNINGS OFF는 Snowflake에서 직접 구성할 수 있는 설정이 아니므로 SnowConvert AI는 이 EWI를 생성합니다.
코드 예시¶
SQL 서버¶
SET ANSI_WARNINGS OFF;
Snowflake¶
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0003 - THE ANSI_WARNINGS OFF IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
SET ANSI_WARNINGS OFF;
모범 사례¶
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-EWI-TS0009¶
다음 트랜잭션에는 중첩 트랜잭션이 포함될 수 있으며 이는 Snowflake에서 지원되지 않는 복잡한 패턴으로 간주됩니다.
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
심각도¶
높음
설명¶
이 오류는 트랜잭션에 중첩 트랜잭션이 포함될 수 있음을 알리기 위해 추가됩니다. SQL Server에서는 트랜잭션을 중첩할 수 있습니다. 즉, 기존 트랜잭션 내에서 새 트랜잭션을 시작할 수 있습니다. 첫 번째 BEGIN 문 이후에 다른 트랜잭션을 실행하면 새 트랜잭션이 열리고 현재 트랜잭션 수가 1씩 증가합니다.\
반면, Snowflake에서는 이 기능이 지원되지 않습니다. 두 번째 BEGIN 문은 무시되며 여전히 하나의 트랜잭션만 남게 됩니다. 자세한 내용은 [SQL Server 트랜잭션]https://learn.microsoft.com/en-us/sql/t-sql/language-elements/transactions-transact-sql?view=sql-server-ver16)을 참조하세요.
코드 예제¶
입력 코드:¶
CREATE PROC transactionsTest
AS
BEGIN TRANSACTION
SELECT @@TRANCOUNT AS TransactionCount_AfterFirstTransaction
INSERT INTO TESTSCHEMA.TESTTABLE(ID) VALUES (1), (2)
BEGIN TRANSACTION
SELECT @@TRANCOUNT AS TransactionCount_AfterSecondTransaction
INSERT INTO TESTSCHEMA.TESTTABLE(ID) VALUES (3), (4)
COMMIT;
SELECT @@TRANCOUNT AS TransactionCount_AfterFirstCommit
COMMIT;
END;
생성된 코드:¶
CREATE OR REPLACE PROCEDURE transactionsTest ()
RETURNS ARRAY
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
ProcedureResultSet1 VARCHAR;
ProcedureResultSet2 VARCHAR;
ProcedureResultSet3 VARCHAR;
return_arr ARRAY := array_construct();
BEGIN
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0009 - THE FOLLOWING TRANSACTION MAY CONTAIN NESTED TRANSACTIONS WHICH ARE NOT SUPPORTED IN SNOWFLAKE. ***/!!!
BEGIN TRANSACTION;
ProcedureResultSet1 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:ProcedureResultSet1) AS
SELECT
:TRANCOUNT AS TransactionCount_AfterFirstTransaction;
return_arr := array_append(return_arr, :ProcedureResultSet1);
INSERT INTO TESTSCHEMA.TESTTABLE (ID) VALUES (1), (2);
BEGIN TRANSACTION;
ProcedureResultSet2 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:ProcedureResultSet2) AS
SELECT
:TRANCOUNT AS TransactionCount_AfterSecondTransaction;
return_arr := array_append(return_arr, :ProcedureResultSet2);
INSERT INTO TESTSCHEMA.TESTTABLE (ID) VALUES (3), (4);
COMMIT;
ProcedureResultSet3 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:ProcedureResultSet3) AS
SELECT
:TRANCOUNT AS TransactionCount_AfterFirstCommit;
return_arr := array_append(return_arr, :ProcedureResultSet3);
COMMIT;
--** SSC-FDM-0020 - MULTIPLE RESULT SETS ARE RETURNED IN TEMPORARY TABLES **
RETURN return_arr;
END;
$$;
-- ** SSC-EWI-0001 - UNRECOGNIZED TOKEN ON LINE '12' COLUMN '1' OF THE SOURCE CODE STARTING AT 'END'. EXPECTED 'BATCH' GRAMMAR. **
--END
;
모범 사례¶
Snowflake에서 중첩 트랜잭션은 컴파일 오류를 일으키지 않으며 단순히 무시됩니다. 평가 보고서에 액세스하여 중첩 트랜잭션이 있는지 확인할 수 있습니다.
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-EWI-TS0010¶
뷰의 공통 테이블 식은 Snowflake에서 지원되지 않습니다.
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
심각도¶
높음
설명¶
이 오류는 뷰의 내부에 유효하지 않은 CTE가 있는 경우에 추가됩니다. 뷰는 쿼리의 구체화된 표현이므로, 뷰는 데이터를 검색하고 표시하는 방법만 정의하며 데이터를 조작하는 방법은 정의하지 않습니다.
코드 예제¶
입력 코드:¶
Create View viewName
as
with commonTableExpressionName (
columnName
) as
(
select
1
)
((select
1 as col2)
union
(
select
1 as col3
));
생성된 코드:¶
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0010 - COMMON TABLE EXPRESSION IN VIEW NOT SUPPORTED IN SNOWFLAKE. ***/!!!
CREATE OR REPLACE VIEW viewName
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
AS
!!!RESOLVE EWI!!! /*** SSC-EWI-0021 - WITH CTE NOT SUPPORTED IN SNOWFLAKE ***/!!!
with commonTableExpressionName (
columnName
) as
(
select
1
)
((select
1 as col2)
union
(
select
1 as col3
));
관련 EWI¶
SSC-EWI-0021: 지원되지 않습니다.
모범 사례¶
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-EWI-TS0013¶
계산된 열이 변환되었습니다
참고
이 EWI는 더 이상 사용되지 않습니다. SSC-FDM-TS0013 설명서를 참조하세요.
심각도¶
낮음
설명¶
이 경고는 SQL Server의 계산된 열이 Snowflake에서 상응하는 열로 변환되는 경우에 추가됩니다. 경우에 따라 기능적 동등성에 영향을 미칠 수 있기 때문에 이 경고가 추가됩니다.
코드 예제¶
입력 코드:¶
CREATE TABLE [TestTable](
[Col1] AS (CONVERT ([REAL], ExpressionValue))
);
생성된 코드:¶
CREATE OR REPLACE TABLE TestTable (
Col1 REAL AS (CAST(ExpressionValue AS REAL)) /*** SSC-FDM-TS0014 - COMPUTED COLUMN WAS TRANSFORMED TO ITS SNOWFLAKE EQUIVALENT, FUNCTIONAL EQUIVALENCE VERIFICATION PENDING. ***/
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
;
모범 사례¶
추가 사용자 작업이 필요하지 않습니다. 이는 단지 정보 제공용입니다.
변환되지 않은 식에 수동 변경 사항을 추가합니다.
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-EWI-TS0015¶
데이터 타입은 Snowflake에서 지원되지 않습니다
심각도¶
Medium
설명¶
이 경고는 SQL Server 열에 Snowflake에서 지원되지 않는 유형이 있는 경우에 추가됩니다.
코드 예제¶
입력 코드:¶
CREATE TABLE table1
(
column1 customType,
);
생성된 코드:¶
CREATE OR REPLACE TABLE table1
(
column1 VARIANT !!!RESOLVE EWI!!! /*** SSC-EWI-TS0015 - DATA TYPE CUSTOMTYPE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
;
모범 사례¶
Snowflake 데이터 타입 설명서에서 해당 데이터 타입에 해당하는 항목을 찾습니다.
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-EWI-TS0016¶
ODBC 스칼라 함수에 대한 변환이 보류 중입니다
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
설명¶
이 EWI는 SnowConvert AI가 입력 코드 내부에서 ODBC 스칼라 함수를 발견한 경우에 추가됩니다.\ 사용자 정의 함수는 ODBC 스칼라 함수에서 지원되지 않습니다.
코드 예제¶
입력 코드:¶
SELECT {fn CURRENT_DATE_UDF()};
생성된 코드:¶
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "CURRENT_DATE_UDF" **
SELECT
CURRENT_DATE_UDF() !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'CURRENT_DATE_UDF' NODE ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-TS0016 - USER DEFINED FUNCTIONS ARE NOT SUPPORTED IN ODBC SCALAR FUNCTION. ***/!!!;
관련 EWI¶
SSC-EWI-0073: 기능적 동등성 검토가 보류 중입니다.
모범 사례¶
추가 사용자 작업이 필요하지 않습니다. 이는 단지 정보 제공용입니다.
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-EWI-TS0017¶
마스킹은 지원되지 않습니다
심각도¶
낮음
설명¶
이 EWI는 SnowConvert AI가 CREATE TABLE 문 내부에서 마스킹된 열을 발견한 경우에 추가됩니다. 이 기능은 열 선언에 옵션을 추가해도 작동하지 않습니다. SQL Server와 동일하게 동작하려면 수동 작업이 필요합니다.
코드 예제¶
입력 코드:¶
CREATE TABLE TABLE1
(
[COL1] nvarchar MASKED WITH (FUNCTION = 'default()') NULL,
[COL2] varchar(100) MASKED WITH (FUNCTION = 'partial(1, "xxxxx", 1)') NULL,
[COL3] varchar(100) MASKED WITH (FUNCTION = 'email()') NOT NULL,
[COL4] smallint MASKED WITH (FUNCTION = 'random(1, 100)') NULL
);
생성된 코드:¶
CREATE OR REPLACE TABLE TABLE1
(
COL1 VARCHAR
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0017 - COLUMN MASKING NOT SUPPORTED IN CREATE TABLE ***/!!!
MASKED WITH (FUNCTION = 'default()') NULL,
COL2 VARCHAR(100)
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0017 - COLUMN MASKING NOT SUPPORTED IN CREATE TABLE ***/!!!
MASKED WITH (FUNCTION = 'partial(1, "xxxxx", 1)') NULL,
COL3 VARCHAR(100)
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0017 - COLUMN MASKING NOT SUPPORTED IN CREATE TABLE ***/!!!
MASKED WITH (FUNCTION = 'email()') NOT NULL,
COL4 SMALLINT
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0017 - COLUMN MASKING NOT SUPPORTED IN CREATE TABLE ***/!!!
MASKED WITH (FUNCTION = 'random(1, 100)') NULL
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
;
모범 사례¶
SnowConvert AI는 현재 버전에서 MASKING POLICIES를 생성하지 않으므로 수동으로 생성해야 합니다. 예:
첫 번째 단계는 마스킹 정책 관리자 역할을 만드는 것입니다.
create role masking_admin;
두 번째 단계는 생성된 역할에 필요한 권한을 부여하는 것입니다.
grant create masking policy on schema PUBLIC to role masking_admin;
allow table_owner role to set or unset the ssn_mask masking policy -- (optional)
grant apply on masking policy ssn_mask to role table_owner;
다음 단계는 마스킹 정책 함수를 만드는 것입니다.
-- default mask
create or replace masking policy default_mask as (val string) returns string ->
case
when current_role() in ('ANALYST') then val
else 'xxxx'
end;
-- partial mask
create or replace masking policy partial_mask as (val string) returns string ->
case
when current_role() in ('ANALYST') then val
else LEFT(val,1) || 'xxxxx' || RIGHT(val,1)
end;
-- email mask
create or replace masking policy email_mask as (val string) returns string ->
case
when current_role() in ('ANALYST') then val
else LEFT(val,1) || 'XXX@XXX.com'
end;
-- random mask
create or replace masking policy random_mask as (val smallint) returns smallint ->
case
when current_role() in ('ANALYST') then val
else UNIFORM(1,100,RANDOM())::SMALLINT
end;
참고
예제로, SQL Server에서 몇 가지 마스킹 함수를 가져와 Snowflake에서 해당 함수로 변환해 보겠습니다.
마지막 단계는 SQL Server에서 원래 마스킹 옵션이 있었던 열에 마스킹 정책을 추가하는 것입니다.
alter table if exists TABLE1 modify column COL1 set masking policy default_mask;
alter table if exists TABLE1 modify column COL2 set masking policy partial_mask;
alter table if exists TABLE1 modify column COL3 set masking policy email_mask;
alter table if exists TABLE1 modify column COL4 set masking policy random_mask;
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-EWI-TS0023¶
대량 옵션이 지원되지 않습니다
심각도¶
낮음
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
설명¶
이 EWI는 BULK INSERT의 일부 옵션을 매핑할 수 없는 경우에 추가됩니다. 변환된 대량 옵션은 FILE FORMAT 옵션으로 반영되어야 합니다.
코드 예제¶
입력 코드:¶
BULK INSERT #PCE FROM 'E:\PCE_Look-up_table.txt'
WITH
(
FIELDTERMINATOR ='\t',
ROWTERMINATOR ='\n',
FIRE_TRIGGERS
);
생성된 코드:¶
CREATE OR REPLACE FILE FORMAT FILE_FORMAT_638461199649565070
FIELD_DELIMITER = '\t'
RECORD_DELIMITER = '\n'
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0023 - 'FIRE_TRIGGERS' BULK OPTION COULD NOT BE TRANSFORMED TO ANY OF THE EXISTING FILE FORMAT OPTIONS ***/!!!
FIRE_TRIGGERS;
CREATE OR REPLACE STAGE STAGE_638461199649565070
FILE_FORMAT = FILE_FORMAT_638461199649565070;
--** SSC-FDM-TS0004 - PUT STATEMENT IS NOT SUPPORTED ON WEB UI. YOU SHOULD EXECUTE THE CODE THROUGH THE SNOWFLAKE CLI **
PUT file://E:\PCE_Look-up_table.txt @STAGE_638461199649565070 AUTO_COMPRESS = FALSE;
COPY INTO T_PCE FROM @STAGE_638461199649565070/PCE_Look-up_table.txt;
모범 사례¶
SnowSQL CLI사용자 가이드를 참조하세요.
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
관련 EWI¶
SSC-FDM-TS0004: UI에서 PUT 문은 지원되지 않습니다.
SSC-EWI-TS0024¶
대량 삽입에 대한 불완전한 변환
심각도¶
낮음
설명¶
이 EWI는 저장 프로시저 내부의 BULK INSERT가 전혀 식별되지 않아 전체 변환에 대한 종속성이 생성되지 않는 경우에 발생합니다. 또한 변환된 COPY INTO는 수동으로 생성해야 하는 tempStage에서 파일을 검색합니다.
코드 예제¶
입력 코드:¶
CREATE PROCEDURE BULK_PROC2
AS
BULK INSERT dbo.table1 FROM 'E:\test.txt'
WITH
(
FIELDTERMINATOR ='\t',
ROWTERMINATOR ='\n'
);
GO
생성된 코드:¶
CREATE OR REPLACE FILE FORMAT FILE_FORMAT_638461207064166040
FIELD_DELIMITER = '\t'
RECORD_DELIMITER = '\n';
CREATE OR REPLACE STAGE STAGE_638461207064166040
FILE_FORMAT = FILE_FORMAT_638461207064166040;
--** SSC-FDM-TS0004 - PUT STATEMENT IS NOT SUPPORTED ON WEB UI. YOU SHOULD EXECUTE THE CODE THROUGH THE SNOWFLAKE CLI **
PUT file://E:\test.txt @STAGE_638461207064166040 AUTO_COMPRESS = FALSE;
CREATE OR REPLACE PROCEDURE BULK_PROC2 ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
// REGION SnowConvert AI Helpers Code
// END REGION
EXEC(`COPY INTO dbo.table1 FROM @STAGE_638461207064166040/test.txt`);
$$
모범 사례¶
파일을 검색하려면 STAGE 및 FILE FORMAT을 수동으로 생성합니다.
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-EWI-TS0025¶
ERROR_SEVERITY 함수가 변환되었습니다
심각도¶
낮음
참고
JavasScript를 대상 언어로 사용하고 -t JavaScript 또는 –PLTargetLanguage JavaScript 플래그를 추가해 프로시저 및 매크로를 생성합니다.
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
설명¶
이 EWI는 ERROR_SEVERITY 기본 제공 함수가 변환되는 경우에 추가됩니다. 기본적으로 이 함수는 SQL Server에서 가장 일반적인 심각도인 16을 반환합니다. 생성된 UDF를 다시 검색해야 합니다.
코드 예제¶
입력 코드:¶
-- Additional Params: -t JavaScript
CREATE procedure proc1()
as
BEGIN TRY
-- Generate a divide-by-zero error.
SELECT 1/0 from table1;
END TRY
BEGIN CATCH
return ERROR_SEVERITY();
END CATCH;
GO
생성된 코드:¶
CREATE OR REPLACE PROCEDURE proc1 ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert AI Helpers Code section is omitted.
try {
EXEC(` -- Generate a divide-by-zero error.
SELECT
TRUNC( 1/0) from
table1`);
} catch(error) {
return SELECT(` !!!RESOLVE EWI!!! /*** SSC-EWI-TS0025 - CUSTOM UDF 'ERROR_SEVERITY_UDF' INSERTED FOR ERROR_SEVERITY FUNCTION. ***/!!!
ERROR_SEVERITY_UDF()`);
}
$$;
모범 사례¶
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-EWI-TS0026¶
Delete From이 있는 쿼리가 Create Table로 변환되었습니다.
심각도¶
낮음
설명¶
이 EWI는 Delete From이 있는 공통 테이블 식이 Create Table 또는 Replace Table로 변환되는 경우에 추가됩니다.
코드 예제¶
입력 코드:¶
WITH Duplicated AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ID) AS RN
FROM WithQueryTest
)
DELETE FROM Duplicated
WHERE Duplicated.RN > 1
생성된 코드:¶
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0026 - WITH DELETE QUERY TURNED TO CREATE TABLE ***/!!!
CREATE OR REPLACE TABLE WithQueryTest AS
SELECT
*
FROM
WithQueryTest
QUALIFY
ROW_NUMBER()
OVER (PARTITION BY
ID
ORDER BY ID) = 1;
모범 사례¶
추가 사용자 작업이 필요하지 않습니다.
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-EWI-TS0032¶
대량 삽입이 부분적으로 변환되었습니다
경고
이 EWI는 Javascript가 저장 프로시저의 대상 언어인 경우에만 생성됩니다. Snowflake Scripting이 저장 프로시저에 권장되는 대상 언어이므로 이 기능은 더 이상 사용되지 않는 변환 기능입니다.
심각도¶
높음
참고
JavasScript를 대상 언어로 사용하고 -t JavaScript 또는 –PLTargetLanguage JavaScript 플래그를 추가해 프로시저 및 매크로를 생성합니다.
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
설명¶
이 EWI는 포함된 코드에 BULK INSERT 문이 있는 경우 원래 연결이었던 리터럴에 추가됩니다. BULK INSERT 변환의 결과로 생성된 PUT 명령은 원래 동적 SQL이었던 코드를 실행할 때 지원되지 않습니다.
따라서 PUT 명령은 출력 코드에서 추출하여 이를 포함하는 프로시저 외부에서 수동으로 실행해야 합니다. 프로시저 내부의 동적 SQL 문장에 많은 BULK INSERT 문이 있는 경우, 변환된 각 BULK INSERT에 해당 PUT 명령을 수동으로 실행할 수 있도록 이 프로시저를 분할하는 것이 좋습니다.
코드 예제¶
입력 코드:¶
-- Additional Params: -t JavaScript
CREATE PROCEDURE [dbo].[Load_FuelMgtMasterData]
AS
BEGIN
SET NOCOUNT ON;
DECLARE
@SQLString VARCHAR(500)
, @ImportName VARCHAR(200)
, @Today DATE
, @Yesterday DATE
, @SourceAffiliates VARCHAR(200);
SET @Today = GETDATE();
SET @Yesterday = DATEADD(DAY, -1, @Today);
TRUNCATE TABLE dbo.SourceFM_Affiliates;
SET @ImportName = '\\' + +@@ServerName
+ '\WorkA\merchantportal\affiliates.txt';
SET @SQLString = 'BULK INSERT ' + @SourceAffiliates + ' FROM '''
+ @ImportName + '''';
EXEC (@SQLString);
END;
생성된 코드:¶
CREATE OR REPLACE PROCEDURE dbo.Load_FuelMgtMasterData ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert AI Helpers Code section is omitted.
/*** SSC-EWI-0040 - THE 'SET' CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/
/* SET NOCOUNT ON*/
;
let SQLSTRING;
let IMPORTNAME;
let TODAY;
let YESTERDAY;
let SOURCEAFFILIATES;
TODAY = SELECT(` CURRENT_TIMESTAMP() :: TIMESTAMP`);
YESTERDAY = SELECT(` DATEADD(DAY, -1, ?)`,[TODAY]);
EXEC(` TRUNCATE TABLE dbo.SourceFM_Affiliates`);
IMPORTNAME = `\\` + SERVERNAME + `\WorkA\merchantportal\affiliates.txt`;
SQLSTRING =
// ** SSC-EWI-TS0032 - THE BULK INSERT WAS PART OF A DYNAMIC SQL, WHICH MAKES SOME OF THE TRANSLATED ELEMENTS INVALID UNLESS EXECUTED OUTSIDE DYNAMIC CODE. **
`CREATE OR REPLACE FILE FORMAT FILE_FORMAT_638923328992788100;
CREATE OR REPLACE STAGE STAGE_638923328992788100
FILE_FORMAT = FILE_FORMAT_638923328992788100;
PUT file://${IMPORTNAME} @STAGE_638923328992788100 AUTO_COMPRESS = FALSE;
COPY INTO ${SOURCEAFFILIATES}
FROM @STAGE_638923328992788100/${IMPORTNAME}`;
EXEC(`${SQLSTRING}`);
$$;
모범 사례¶
동적
BULK INSERT문에서 생성된PUT명령을 추출하여 프로시저를 호출하기 전에 실행합니다.추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-EWI-TS0034¶
누락된 기호로 인해 RETURNS 절이 불완전합니다
심각도¶
높음
설명¶
이 EWI는 CREATE FUNCTION의 RETURNS TABLE 절을 올바르게 생성할 수 없는 경우 출력 코드에 추가됩니다. 이는 결과 RETURNS TABLE 절에 지정해야 하는 열을 SnowConvert AI가 유추할 수 없어 RETURNS TABLE 절이 비어 있는 경우에 발생합니다.
코드 예제¶
입력 코드:¶
CREATE FUNCTION Sales.ufn_SalesByStore2()
RETURNS TABLE
AS
RETURN
(
WITH CTE AS (
SELECT DepartmentID, Name, GroupName
FROM HumanResources.Department
)
SELECT tab.* FROM CTE tab
);
GO
SELECT * FROM GetDepartmentInfo();
생성된 코드:¶
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "HumanResources.Department" **
CREATE OR REPLACE FUNCTION Sales.ufn_SalesByStore2 ()
RETURNS TABLE(
DepartmentID STRING /*** SSC-FDM-TS0012 - INFORMATION FOR THE COLUMN DepartmentID WAS NOT FOUND. STRING DATATYPE USED TO MATCH CAST AS STRING OPERATION ***/,
Name STRING /*** SSC-FDM-TS0012 - INFORMATION FOR THE COLUMN Name WAS NOT FOUND. STRING DATATYPE USED TO MATCH CAST AS STRING OPERATION ***/,
GroupName STRING /*** SSC-FDM-TS0012 - INFORMATION FOR THE COLUMN GroupName WAS NOT FOUND. STRING DATATYPE USED TO MATCH CAST AS STRING OPERATION ***/
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "transact", "convertedOn": "07/14/2025", "domain": "no-domain-provided" }}'
AS
$$
--** SSC-PRF-TS0001 - PERFORMANCE WARNING - RECURSION FOR CTE NOT CHECKED. MIGHT REQUIRE RECURSIVE KEYWORD **
WITH CTE AS (
SELECT
DepartmentID,
Name,
GroupName
FROM
HumanResources.Department
)
SELECT tab.* FROM
CTE tab
$$;
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "GetDepartmentInfo" **
SELECT
*
FROM
TABLE(GetDepartmentInfo());
모범 사례¶
이 문제의 원인은 다양할 수 있습니다. 코드에 필요한 모든 오브젝트를 포함해야 합니다. 마이그레이션에서 필요한 모든 오브젝트에 액세스할 수 있음에도 문제가 지속되는 경우 구체적인 시나리오에 대한 정보와 함께 당사에 문의합니다.
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-EWI-TS0035¶
초기화되지 않은 커서 변수 선언은 지원되지 않습니다.
심각도¶
Medium
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
설명¶
현재, 선언되었지만 초기화되지 않은 커서 변수는 SnowFlake에서 지원되지 않습니다. 따라서 이 EWI가 추가되고 코드가 주석 처리됩니다.
코드 예제¶
입력 코드:¶
CREATE OR ALTER PROCEDURE notInitializedCursorTest
AS
BEGIN
-- Should be marked with SSC-EWI-TS0035
DECLARE @MyCursor CURSOR, @MyCursor2 CURSOR;
-- Should not be marked
DECLARE cursorVar CURSOR FORWARD_ONLY STATIC READ_ONLY
FOR
SELECT someCol
FROM someTable;
RETURN 'DONE';
END;
생성된 코드:¶
CREATE OR REPLACE PROCEDURE notInitializedCursorTest ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
-- Should be marked with SSC-EWI-TS0035
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0035 - CURSOR VARIABLE DECLARED BUT NEVER INITIALIZED, THIS IS NOT SUPPORTED IN SNOWFLAKE SCRIPTING ***/!!!
MYCURSOR CURSOR;
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0035 - CURSOR VARIABLE DECLARED BUT NEVER INITIALIZED, THIS IS NOT SUPPORTED IN SNOWFLAKE SCRIPTING ***/!!!
MYCURSOR2 CURSOR;
-- Should not be marked
cursorVar CURSOR
FOR
SELECT
someCol
FROM
someTable;
BEGIN
RETURN 'DONE';
END;
$$;
모범 사례¶
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-EWI-TS0036¶
Snowflake Scripting은 로컬 커서만 지원합니다.
심각도¶
Medium
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
설명¶
이 EWI는 로컬 커서 이외의 커서가 식별되는 경우에 추가됩니다. 현재, Snowflake Scripting은 로컬 커서만 지원합니다. 따라서 모든 커서는 로컬 커서로 변환됩니다.
코드 예제¶
입력 코드:¶
CREATE OR ALTER PROCEDURE globalCursorTest
AS
BEGIN
-- Should be marked with SSC-EWI-TS0036
DECLARE MyCursor CURSOR GLOBAL STATIC READ_ONLY
FOR
SELECT *
FROM exampleTable;
-- Should not be marked
DECLARE MyCursor2 CURSOR LOCAL STATIC READ_ONLY
FOR
SELECT testCol
FROM myTable;
RETURN 'DONE';
END;
CREATE OR REPLACE PROCEDURE globalCursorTest ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
-- Should be marked with SSC-EWI-TS0036
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0036 - SNOWFLAKE SCRIPTING ONLY SUPPORTS LOCAL CURSORS ***/!!!
MyCursor CURSOR
FOR
SELECT
*
FROM
exampleTable;
-- Should not be marked
MyCursor2 CURSOR
FOR
SELECT
testCol
FROM
myTable;
BEGIN
RETURN 'DONE';
END;
$$;
모범 사례¶
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-EWI-TS0037¶
Snowflake Scripting 커서는 스크롤할 수 없습니다.
심각도¶
Medium
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
설명¶
Snowflake Scripting 커서는 스크롤할 수 없습니다. 현재는 FETCH NEXT만 지원됩니다.
코드 예제¶
입력 코드:¶
CREATE OR ALTER PROCEDURE scrollablecursorTest
AS
BEGIN
-- Should be marked with SSC-EWI-TS0037
DECLARE CursorVar CURSOR SCROLL STATIC READ_ONLY
FOR
SELECT FirstName
FROM vEmployee;
-- Should not be marked
DECLARE CursorVar2 CURSOR STATIC READ_ONLY
FOR
SELECT FirstName
FROM vEmployee;
DECLARE CursorVar3 CURSOR FORWARD_ONLY STATIC READ_ONLY
FOR
SELECT FirstName
FROM vEmployee;
RETURN 'DONE';
END;
생성된 코드:¶
CREATE OR REPLACE PROCEDURE scrollablecursorTest ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
-- Should be marked with SSC-EWI-TS0037
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0037 - SNOWFLAKE SCRIPTING CURSORS ARE NON-SCROLLABLE, ONLY FETCH NEXT IS SUPPORTED ***/!!!
CursorVar CURSOR
FOR
SELECT
FirstName
FROM
vEmployee;
-- Should not be marked
CursorVar2 CURSOR
FOR
SELECT
FirstName
FROM
vEmployee;
CursorVar3 CURSOR
FOR
SELECT
FirstName
FROM
vEmployee;
BEGIN
RETURN 'DONE';
END;
$$;
모범 사례¶
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-EWI-TS0039¶
동일한 커서에 대한 여러 SET 문이 발견되었습니다.
심각도¶
Medium
설명¶
이 EWI는 동일한 커서에 대해 여러 SET 문이 발견되는 경우에 추가됩니다. 모든 추가 SET 문도 주석 처리됩니다. 이는 Snowflake Scripting에서는 동일한 커서에 대해 여러 SET 문을 사용하는 것이 유효하지 않기 때문에 발생합니다.
코드 예시:¶
이 EWI는 동일한 커서에 대해 여러 SET 문이 발견되는 경우에 추가됩니다. 모든 추가 SET 문도 주석 처리됩니다. 이는 Snowflake Scripting에서는 동일한 커서에 대해 여러 SET 문을 사용하는 것이 유효하지 않기 때문에 발생합니다.¶
코드 예시:¶
입력 코드:¶
CREATE OR ALTER PROCEDURE multipleSetExample
AS
BEGIN
DECLARE @MyCursor CURSOR;
DECLARE @MyCursor2 CURSOR STATIC READ_ONLY
FOR
SELECT FirstName
FROM vEmployee;
DECLARE @MyCursor3 CURSOR;
SET @MyCursor = CURSOR STATIC READ_ONLY
FOR
SELECT col3
FROM defaultTable;
SET @MyCursor3 = CURSOR STATIC READ_ONLY
FOR
SELECT *
FROM someTable;
SET @MyCursor = CURSOR DYNAMIC
FOR
SELECT col2
FROM exampleTable;
SET @MyCursor2 = CURSOR STATIC READ_ONLY
FOR
SELECT col3
FROM defaultTable;
RETURN 'DONE';
END;
생성된 코드:¶
CREATE OR REPLACE PROCEDURE multipleSetExample ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
MYCURSOR CURSOR
FOR
SELECT col3
FROM defaultTable;
MYCURSOR2 CURSOR
FOR
SELECT
FirstName
FROM
vEmployee;
MYCURSOR3 CURSOR
FOR
SELECT *
FROM someTable;
BEGIN
DECLARE
MYCURSOR CURSOR
FOR
SELECT col3
FROM defaultTable;
MYCURSOR2 CURSOR
FOR
SELECT
FirstName
FROM
vEmployee;
MYCURSOR3 CURSOR
FOR
SELECT *
FROM someTable;
BEGIN
!!!RESOLVE EWI!!! /*** SSC-EWI-0040 - THE 'SET CURSOR' CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-TS0039 - CURSOR VARIABLE MYCURSOR SET MULTIPLE TIMES, THIS IS NOT VALID IN SNOWFLAKE SCRIPTING ***/!!!
SET @MyCursor = CURSOR DYNAMIC
FOR
SELECT col2
FROM exampleTable;
!!!RESOLVE EWI!!! /*** SSC-EWI-0040 - THE 'SET CURSOR' CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-TS0039 - CURSOR VARIABLE MYCURSOR2 SET MULTIPLE TIMES, THIS IS NOT VALID IN SNOWFLAKE SCRIPTING ***/!!!
SET @MyCursor2 = CURSOR STATIC READ_ONLY
FOR
SELECT col3
FROM defaultTable;
RETURN 'DONE';
END;
$$;
모범 사례¶
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-EWI-TS0041¶
XML 데이터 타입 메서드는 Snowflake에서 지원되지 않습니다.
심각도¶
Medium
설명¶
이 EWI는 Snowflake SQL에서 지원되지 않는 다음의 XML 데이터 타입 메서드에 추가됩니다.
값
쿼리
존재
수정
노드
코드 예제¶
입력 코드:¶
CREATE PROCEDURE xml_procedure
@inUserGroupsXML XML
AS
BEGIN
SELECT entities.entity.value('TypeID[1]', 'VARCHAR(100)') AS TypeID
,entities.entity.value('Name[1]', 'VARCHAR(100)') AS Name
INTO #tmpUserGroups
FROM @inUserGroupsXML.nodes('/entities/entity') entities(entity)
END;
생성된 코드:¶
CREATE OR REPLACE PROCEDURE xml_procedure (INUSERGROUPSXML TEXT)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
BEGIN
CREATE OR REPLACE TEMPORARY TABLE T_tmpUserGroups AS
SELECT
XMLGET(entity, '$') :: VARCHAR(100) AS TypeID
,
XMLGET(entity, '$') :: VARCHAR(100) AS Name
FROM
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0041 - XML TYPE METHOD nodes IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
T_inUserGroupsXML('/entities/entity') entities (
entity
);
END;
$$;
모범 사례¶
소스 코드의 동작을 에뮬레이트하기 위해 UDFs를 사용합니다.
이 설명서를 참조하여 Snowflake에서 XML을 사용할 수 있는 몇 가지 방식을 검토할 수 있습니다.
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-EWI-TS0043¶
WITH XMLNAMESPACES는 Snowflake에서 지원되지 않습니다.
심각도¶
Medium
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
설명¶
이 EWI는 Snowflake SQL에서 지원되지 않는 WITHXMLNAMESPACES 절에 추가됩니다.
코드 예제¶
입력 코드:¶
WITH XMLNAMESPACES ('uri' as ns1)
SELECT ProductID as 'ns1:ProductID',
Name as 'ns1:Name',
Color as 'ns1:Color'
FROM Production.Product
WHERE ProductID = 316
FOR XML RAW, ELEMENTS XSINIL
생성된 코드:¶
--** SSC-PRF-TS0001 - PERFORMANCE WARNING - RECURSION FOR CTE NOT CHECKED. MIGHT REQUIRE RECURSIVE KEYWORD **
WITH
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0043 - WITH XMLNAMESPACES IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
XMLNAMESPACES ('uri' as VARIANT !!!RESOLVE EWI!!! /*** SSC-EWI-TS0015 - DATA TYPE NS1 IS NOT SUPPORTED IN SNOWFLAKE ***/!!! NOT NULL)
SELECT
ProductID AS "ns1:ProductID",
Name AS "ns1:Name",
Color AS "ns1:Color"
FROM
Production.Product
WHERE
ProductID = 316
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0044 - FOR XML RAW CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
FOR XML RAW, ELEMENTS XSINIL;
모범 사례¶
소스 코드의 동작을 에뮬레이트하기 위해 UDFs를 사용합니다. 다음 코드는 원래 동작을 다시 만드는 데 사용할 수 있는 UDFs를 제안합니다.
SQL 서버¶
CREATE TABLE PRODUCT (ProductID INTEGER, Name VarChar(20), Color VarChar(20));
INSERT INTO PRODUCT(PRODUCTID, NAME, COLOR) VALUES(1,'UMBRELLA','RED');
INSERT INTO PRODUCT(PRODUCTID, NAME, COLOR) VALUES(2,'SHORTS','BLUE');
INSERT INTO PRODUCT(PRODUCTID, NAME, COLOR) VALUES(3,'BALL','YELLOW');
WITH XMLNAMESPACES ('uri' as ns1)
SELECT ProductID as 'ns1:ProductID',
Name as 'ns1:Name',
Color as 'ns1:Color'
FROM Product
FOR XML RAW
Snowflake SQL¶
CREATE OR REPLACE TABLE PRODUCT (
ProductID INTEGER,
Name VARCHAR(20),
Color VARCHAR(20))
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "transact", "convertedOn": "07/12/2024" }}'
;
INSERT INTO PRODUCT (PRODUCTID, NAME, COLOR) VALUES(1,'UMBRELLA','RED');
INSERT INTO PRODUCT (PRODUCTID, NAME, COLOR) VALUES(2,'SHORTS','BLUE');
INSERT INTO PRODUCT (PRODUCTID, NAME, COLOR) VALUES(3,'BALL','YELLOW');
--** SSC-PRF-TS0001 - PERFORMANCE WARNING - RECURSION FOR CTE NOT CHECKED. MIGHT REQUIRE RECURSIVE KEYWORD **
WITH
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0043 - WITH XMLNAMESPACES IS NOT SUPPORTED IN SNOWFLAKE ***/!!! XMLNAMESPACES ('uri' as ns1)
SELECT
ProductID AS "ns1:ProductID",
Name AS "ns1:Name",
Color AS "ns1:Color"
FROM
Product
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0044 - FOR XML RAW CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
FOR XML RAW;
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
관련 EWI¶
SSC-PRF-TS0001: 성능 경고 - CTE에 대한 재귀가 확인되지 않았습니다. 재귀 키워드가 필요할 수 있습니다.
SSC-EWI-TS0044: FOR XML 절은 Snowflake에서 지원되지 않습니다.
SSC-EWI-TS0015: Snowflake에서 지원되지 않는 데이터 타입
SSC-EWI-TS0044¶
FOR XML 절은 Snowflake에서 지원되지 않습니다.
심각도¶
중요
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
설명¶
이 EWI는 Snowflake SQL에서 지원되지 않는 FOR XML 절에 추가됩니다.
코드 예제¶
입력 코드:¶
SELECT TOP 1 LastName
FROM AdventureWorks2019.Person.Person
FOR XML AUTO;
생성된 코드:¶
SELECT TOP 1
LastName
FROM
AdventureWorks2019.Person.Person
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0044 - FOR XML AUTO CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
FOR XML AUTO;
모범 사례¶
소스 코드의 동작을 에뮬레이트하기 위해 UDFs를 사용합니다. 다음 코드는 원래 동작을 다시 만드는 데 사용할 수 있는 UDFs를 제안합니다.
SQL 서버
쿼리¶
CREATE TABLE TEMPTABLE (Ref INT, Des NVARCHAR(100), Qty INT)
INSERT INTO tempTable VALUES (100001, 'Normal', 1), (100002, 'Foobar', 1), (100003, 'Hello World', 2)
GO
-- FOR XML
SELECT *
FROM TempTable
FOR XML AUTO
GO
-- FOR XML RAW
SELECT *
FROM TempTable
FOR XML RAW
결과¶
-- FOR XML
<TempTable Ref="100001" Des="Normal" Qty="1"/><TempTable Ref="100002" Des="Foobar" Qty="1"/><TempTable Ref="100003" Des="Hello World" Qty="2"/>
-- FOR XML RAW
<row Ref="100001" Des="Normal" Qty="1"/><row Ref="100002" Des="Foobar" Qty="1"/><row Ref="100003" Des="Hello World" Qty="2"/>
Snowflake¶
쿼리¶
CREATE OR REPLACE TABLE TEMPTABLE (
Ref INT,
Des VARCHAR(100),
Qty INT
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
;
INSERT INTO tempTable VALUES (100001, 'Normal', 1), (100002, 'Foobar', 1), (100003, 'Hello World', 2);
-- FOR XML
SELECT
*
FROM
TempTable
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0044 - FOR XML AUTO CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
FOR XML AUTO;
-- FOR XML RAW
SELECT
*
FROM
TempTable
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0044 - FOR XML RAW CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
FOR XML RAW;
결과¶
-- FOR XML
<TempTable DES="Normal" QTY="1" REF="100001" /><TempTable DES="Foobar" QTY="1" REF="100002" /><TempTable DES="Hello World" QTY="2" REF="100003" />
-- FOR XML RAW
<row DES="Normal" QTY="1" REF="100001" /><row DES="Foobar" QTY="1" REF="100002" /><row DES="Hello World" QTY="2" REF="100003" />
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-EWI-TS0045¶
레이블이 지정된 문은 Snowflake Scripting에서 지원되지 않습니다.
심각도¶
낮음
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
설명¶
이 EWI는 SQL Server에서 GOTO 문과 함께 사용되는 모든 LABELS에 추가됩니다.
코드 예제¶
입력 코드:¶
CREATE PROCEDURE GoToProcedure
AS
BEGIN
DECLARE @TotalMaarks INT
SET @TotalMaarks = 49
IF @TotalMaarks >= 50
GOTO Pass
IF @TotalMaarks < 50
GOTO Fail
Pass:
SELECT 1;
SELECT * FROM TABLE1;
RETURN 1;
Fail:
SELECT 2;
SELECT * FROM TABLE2;
RETURN 2;
END
생성된 코드:¶
CREATE OR REPLACE PROCEDURE GoToProcedure ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
TOTALMAARKS INT;
BEGIN
TOTALMAARKS := 49;
IF (:TOTALMAARKS >= 50) THEN
!!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'GOTO' NODE ***/!!!
GOTO Pass
END IF;
IF (:TOTALMAARKS < 50) THEN
!!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'GOTO' NODE ***/!!!
GOTO Fail
END IF;
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0045 - LABELED STATEMENT IS NOT SUPPORTED IN SNOWFLAKE SCRIPTING ***/!!!
Pass:
SELECT 1;
SELECT
*
FROM
TABLE1;
RETURN 1;
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0045 - LABELED STATEMENT IS NOT SUPPORTED IN SNOWFLAKE SCRIPTING ***/!!!
Fail:
SELECT 2;
SELECT
*
FROM
TABLE2;
RETURN 2;
END;
$$;
모범 사례¶
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
관련 EWI¶
SSC-EWI-0073: 기능적 동등성 검토가 보류 중입니다.
SSC-EWI-TS0046¶
시스템 테이블은 Snowflake에서 지원되지 않습니다.
심각도¶
Medium
설명¶
이 EWI는 Snowflake SQL에서 지원되지 않거나 동등한 기능이 없는 SQL Server 시스템 테이블을 참조하는 경우에 추가됩니다. 지원되는 시스템 테이블과 지원되지 않는 시스템 테이블의 전체 목록을 보려면 여기를 클릭하세요.
코드 예제¶
입력 코드:¶
SELECT *
FROM
sys.all_sql_modules
WHERE
[STATE] = 0; -- state must be ONLINE
생성된 코드:¶
SELECT
*
FROM
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0046 - SYSTEM TABLE sys.all_sql_modules IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
sys.all_sql_modules
WHERE
STATE = 0; -- state must be ONLINE
모범 사례¶
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-EWI-TS0047¶
RAISERROR 오류 메시지는 SQL Server 문자열 형식으로 인해 다를 수 있습니다.
참고
이 EWI는 더 이상 사용되지 않습니다. SSC-FDM-TS0019 설명서를 참조하세요.
심각도¶
낮음
설명¶
이 EWI는 RAISERROR 오류 메시지가 SQL Server 문자열 형식으로 인해 다를 수 있음을 알리기 위해 추가됩니다.
코드 예제¶
입력 코드:¶
CREATE PROCEDURE RAISERROR_PROCEDURE
AS
BEGIN
RAISERROR ('This is a sample error message with the first parameter %d and the second parameter %*.*s',
10,
1,
123,
7,
7,
'param2');
END
생성된 코드:¶
CREATE OR REPLACE PROCEDURE RAISERROR_PROCEDURE ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
BEGIN
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0047 - RAISERROR ERROR MESSAGE MAY DIFFER BECAUSE OF THE SQL SERVER STRING FORMAT ***/!!!
SELECT
RAISERROR_UDF('This is a sample error message with the first parameter %d and the second parameter %*.*s',
10,
1, array_construct(
123,
7,
7,
'param2'));
END;
$$;
모범 사례¶
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-EWI-TS0049¶
여러 라인 If 본문 변환은 향후 제공될 예정입니다.
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
심각도¶
Medium
설명¶
IF 문 본문에 Begin ... End 블록이 포함된 대부분의 경우는 지원됩니다. 이는 성공적인 시나리오입니다( SSC-EWI-TS0049가 발생하지 않음).
코드 예제¶
입력 코드:¶
CREATE OR ALTER FUNCTION [PURCHASING].[FOO](@status INT)
Returns INT
As
Begin
declare @result as int = 10;
SELECT @result = quantity FROM TABLE1 WHERE COL1 = @status;
IF @result = 3
BEGIN
IF @result>0 SELECT @result=0 ELSE SELECT @result=1
SELECT @result = 1
END
return @result;
End
생성된 코드:¶
!!!RESOLVE EWI!!! /*** SSC-EWI-0068 - USER DEFINED FUNCTION WAS TRANSFORMED TO SNOWFLAKE PROCEDURE ***/!!!
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "TABLE1" **
CREATE OR REPLACE PROCEDURE PURCHASING.FOO (STATUS INT)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "transact", "convertedOn": "07/14/2025", "domain": "no-domain-provided" }}'
EXECUTE AS CALLER
AS
$$
DECLARE
RESULT INT := 10;
BEGIN
SELECT
quantity
INTO
:RESULT
FROM
TABLE1
WHERE
COL1 = :STATUS;
IF (:RESULT = 3) THEN
BEGIN
IF (:RESULT >0) THEN SELECT
0
INTO
:RESULT;
ELSE
SELECT
1
INTO
:RESULT;
END IF;
SELECT
1
INTO
:RESULT;
END;
END IF;
RETURN :RESULT;
END;
$$;
참고
일반 코드 예제(위의 예제와 같이)에서는 변환이 성공적으로 수행됩니다. 그러나 “IF” 문은 변환되지 않으며 EWI가 생성됩니다.
수동 지원¶
케이스 1: 단일 문¶
이러한 경우에는 변환된 문이 SELECT 절에 나타나므로 변환이 간단합니다.
IF @result = 0
BEGIN
SET @result =1
END
CASE WHEN (SELECT RESULT FROM CTE2)= 0 THEN
( SELECT 1 AS RESULT )
케이스 2: 여러 개의 문¶
여러 문이 변환되는 경우 N개의 문을 변환하고 이를 N+1개 문의 소스 테이블로 사용해야 합니다.
IF @result = 0
BEGIN
Statement1
Statement2
Statement3
END
CASE WHEN (SELECT RESULT FROM CTE2)= 0 THEN
(
SELECT TransformedStatement3
FROM (
SELECT TransformedStatement2
FROM (
SELECT TransformedStatement1
) T1
) T2
)
케이스 3: 여러 세트 문¶
이러한 경우 각 세트 문에 대해 변환을 복제해야 합니다.
IF @result = 0
BEGIN
SET @var1 = 1
SET @var2 = 3
SET @var3 = @var2
END
WITH CTE1 AS (
SELECT
CASE WHEN (SELECT
RESULT
FROM
CTE0) = 0 THEN
(SELECT 1) AS VAR1)
WITH CTE2 AS (
SELECT
CASE WHEN (SELECT
RESULT
FROM
CTE0)= 0 THEN
(SELECT 3) AS VAR2)
WITH CTE3 AS (
SELECT
CASE WHEN (SELECT
RESULT
FROM
CTE0)= 0 THEN
(SELECT T1.VAR2
FROM ((SELECT 3) AS VAR2) AS T1) AS VAR3)
...
모범 사례¶
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-EWI-TS0055¶
기본 제약 조건이 주석 처리되어 테이블 정의에 추가되었을 수 있습니다.
참고
이 EWI는 더 이상 사용되지 않습니다. SSC-FDM-TS0020 설명서를 참조하세요.
심각도¶
Medium
설명¶
이 EWI은 Alter Table 문에 기본 제약 조건이 있는 경우에 추가됩니다.
현재, 해당 제약 조건은 지원되지 않습니다. 이를 변환하는 데 사용할 수 있는 해결 방법은 Alter Table 사용 전에 테이블을 정의하는 것입니다. 그러면 참조를 식별하고 기본 제약 조건이 테이블 정의에 통합됩니다. 해당 작업을 하지 않은 경우 제약 조건이 주석으로만 처리됩니다.
코드 예제¶
입력 코드:¶
CREATE TABLE table1(
col1 integer,
col2 varchar collate Latin1_General_CS,
col3 date
);
ALTER TABLE table1
ADD col4 integer,
CONSTRAINT col1_constraint DEFAULT 50 FOR col1,
CONSTRAINT col1_constraint DEFAULT 30 FOR col1;
생성된 코드:¶
CREATE OR REPLACE TABLE table1 (
col1 INTEGER DEFAULT 50,
col2 VARCHAR COLLATE 'EN-CS',
col3 DATE
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
;
ALTER TABLE table1
ADD col4 INTEGER,
CONSTRAINT col1_constraint
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0055 - DEFAULT CONSTRAINT MAY HAVE BEEN ADDED TO TABLE DEFINITION ***/!!!
DEFAULT 50 FOR col1,
CONSTRAINT col1_constraint
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0055 - DEFAULT CONSTRAINT MAY HAVE BEEN ADDED TO TABLE DEFINITION ***/!!!
DEFAULT 30 FOR col1;
참고
Alter Table의 모든 내용이 유효하지 않은 경우 Alter Table이 주석 처리됩니다.
Known Issues¶
동일한 열에 대해 서로 다른 기본 제약 조건이 선언되면 첫 번째 제약 조건만 Create Table 문에 반영됩니다.
모범 사례¶
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-EWI-TS0056¶
MASKED WITH를 대체하기 위해 MASKING POLICY가 생성되었습니다.
참고
이 EWI는 더 이상 사용되지 않습니다. SSC-FDM-TS0021 설명서를 참조하세요.
심각도¶
낮음
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
설명¶
이 EWI는 Alter Table 문에 MASKED WITH 절이 포함된 경우에 추가됩니다. MASKED WITH 함수를 대체하기 위해 대략적인 MASKING POLICY가 생성되었음을 알리기 위해 추가됩니다.
코드 예제¶
입력 코드:¶
ALTER TABLE table_name
ALTER COLUMN column_name
ADD MASKED WITH (FUNCTION = 'default()');
생성된 코드:¶
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0057 - MASKING ROLE MUST BE DEFINED PREVIOUSLY BY THE USER ***/!!!
CREATE OR REPLACE MASKING POLICY "default" AS
(val STRING)
RETURNS STRING ->
CASE
WHEN current_role() IN ('YOUR_DEFINED_ROLE_HERE')
THEN val
ELSE 'xxxxx'
END;
ALTER TABLE IF EXISTS table_name MODIFY COLUMN column_name!!!RESOLVE EWI!!! /*** SSC-EWI-TS0056 - A MASKING POLICY WAS CREATED AS SUBSTITUTE FOR MASKED WITH ***/!!! SET MASKING POLICY "default";
참고
MASKING POLICY는 ALTER TABLE 문보다 먼저 생성됩니다. 그리고 대략적인 동작이 있을 것으로 예상됩니다. 역할 및 사용자 권한과 관련하여 약간의 조정이 필요할 수 있습니다. <!– TODO: You can relate to Broken link broken-reference “mention” for further details.>
모범 사례¶
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-EWI-TS0057¶
사용자는 미리 마스킹 역할을 정의해야 합니다.
참고
이 EWI는 더 이상 사용되지 않습니다. SSC-FDM-TS0022 설명서 설명서를 참조하세요.
심각도¶
낮음
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
설명¶
이 EWI는 MASKING POLICY가 생성되고 데이터 마스킹이 올바르게 작동할 수 있도록 역할 또는 권한을 연결해야 하는 경우에 발생합니다.
코드 예제¶
입력 코드¶
ALTER TABLE tableName
ALTER COLUMN columnName
ADD MASKED WITH (FUNCTION = 'partial(1, "xxxxx", 1)');
생성된 코드:¶
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0057 - MASKING ROLE MUST BE DEFINED PREVIOUSLY BY THE USER ***/!!!
CREATE OR REPLACE MASKING POLICY "partial_1_xxxxx_1" AS
(val STRING)
RETURNS STRING ->
CASE
WHEN current_role() IN ('YOUR_DEFINED_ROLE_HERE')
THEN val
ELSE LEFT(val, 1) || 'xxxxx' || RIGHT(val, 1)
END;
ALTER TABLE IF EXISTS tableName MODIFY COLUMN columnName!!!RESOLVE EWI!!! /*** SSC-EWI-TS0056 - A MASKING POLICY WAS CREATED AS SUBSTITUTE FOR MASKED WITH ***/!!! SET MASKING POLICY "partial_1_xxxxx_1";
참고
6번째 줄에 표시된 것처럼, 정의된 역할을 배치할 수 있는 자리 표시자가 있습니다. 쉼표로 구분된 하나 이상의 값을 입력할 수 있는 공간이 있습니다. 또한, 여기에서는 각 값에 작은 따옴표를 사용해야 합니다.
모범 사례¶
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-EWI-TS0060¶
날짜 및 시간 간격은 Snowflake에서 지원되지 않습니다.
심각도¶
Medium
설명¶
이 EWI는 Snowflake에서 지원되지 않아 다음 시간 부분 중 하나가 날짜 관련 함수의 매개 변수로 사용되는 경우에 추가됩니다. 자세한 내용은 ‘지원되는 날짜 및 시간 부분(날짜 및 시간 함수 | Snowflake 설명서)을 참조하세요.
코드 예제¶
입력 코드¶
SELECT
-- Supported
DATEPART(second, getdate()),
-- Not supported
DATEPART(millisecond, getdate()),
DATEPART(microsecond, getdate());
생성된 코드:¶
SELECT
-- Supported
DATE_PART(second, CURRENT_TIMESTAMP() :: TIMESTAMP),
-- Not supported
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0060 - TIME PART 'millisecond' NOT SUPPORTED AS A FUNCTION PARAMETER ***/!!!
DATEPART(millisecond, CURRENT_TIMESTAMP() :: TIMESTAMP),
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0060 - TIME PART 'microsecond' NOT SUPPORTED AS A FUNCTION PARAMETER ***/!!!
DATEPART(microsecond, CURRENT_TIMESTAMP() :: TIMESTAMP);
모범 사례¶
UDF를 생성하여 Snowflake에서 지원되지 않는 시간 부분을 수동으로 추출할 수 있습니다.
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-EWI-TS0061¶
ALTER COLUMN은 지원되지 않습니다
심각도¶
Medium
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
설명¶
이 EWI는 지원되지 않는 ALTER COLUMN 문이 있을 때마다 추가됩니다.
코드 예제¶
입력 코드:¶
ALTER TABLE SampleTable
ALTER COLUMN SampleColumn INT NULL SPARSE;
생성된 코드:¶
ALTER TABLE IF EXISTS SampleTable
ALTER COLUMN SampleColumn
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0061 - ALTER COLUMN COMMENTED OUT BECAUSE SPARSE COLUMN IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
INT NULL SPARSE;
모범 사례¶
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-EWI-TS0063¶
Snowflake에서 지원되지 않는 타임존입니다.
심각도¶
중요
설명¶
이 EWI는 Snowflake에서 지원되지 않는 타임존이 있는 경우에 추가됩니다.
코드 예제¶
입력 코드:¶
SELECT current_timestamp at time zone 'Turks And Caicos Standard Time';
생성된 코드:¶
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0063 - TIME ZONE NOT SUPPORTED IN SNOWFLAKE ***/!!!
CURRENT_TIMESTAMP() at time zone 'Turks And Caicos Standard Time'
;
모범 사례¶
여러 타임존을 지원하기 위해 사용자 정의 함수를 만들 수 있습니다.
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-EWI-TS0067¶
OPENXML 테이블 반환 함수에 유효하지 않은 매개 변수가 있습니다.
심각도¶
중요
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
설명¶
이 EWI는 OPENXML에 유효하지 않은 매개 변수가 있는 경우, 특히 XML 경로에 액세스할 수 없는 경우에 추가됩니다.
이를 EWI를 방지하려면 매개 변수를 통해 명시적 노드 경로를 전송하세요.
입력 코드:¶
SELECT
*
FROM
OPENXML (@idoc, @path, 1) WITH (
CustomerID VARCHAR(10),
ContactName VARCHAR(20)
);
생성된 코드:¶
SELECT
*
FROM
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0067 - INVALID PARAMETERS IN OPENXML TABLE-VALUED FUNCTION ***/!!!
OPENXML(@idoc, @path, 1);
입력 코드(명시적 매개 변수)¶
SELECT
*
FROM
OPENXML (@idoc, '/ROOT/Customer', 1) WITH(
CustomerID VARCHAR(10),
ContactName VARCHAR(20)
);
생성된 코드(명시적 매개 변수)¶
SELECT
Left(value:Customer['@CustomerID'], '10') AS 'CustomerID',
Left(value:Customer['@ContactName'], '20') AS 'ContactName'
FROM
OPENXML_UDF($idoc, ':ROOT:Customer');
모범 사례¶
경로를 매개 변수로 명시적으로 전달할 수 있는지 확인합니다.
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-EWI-TS0070¶
At Time Zone 문의 CURRENT_TIMESTAMP는 특정 상황에서 다르게 동작할 수 있습니다.
참고
이 EWI는 더 이상 사용되지 않습니다. SSC-FDM-TS0024 설명서를 참조하세요.
설명¶
이 EWI는 At Time Zone에 CURRENT_TIMESTAMP가 있는 경우에 추가됩니다. 이는 경우에 따라 결과가 다를 수 있기 때문입니다.
주요 차이점은 SQL Server의 CURRENT_TIMESTAMP는 서버 타임존의 현재 시스템 날짜 및 시간을 반환하며, Snowflake의 CURRENT_TIMESTAMP는 UTC(협정 세계시) 타임존의 현재 날짜 및 시간을 반환합니다.
입력 코드:¶
Sql Server¶
SELECT current_timestamp at time zone 'Hawaiian Standard Time';
결과¶
2024-02-08 16:52:55.317 -10:00
생성된 코드:¶
Snowflake¶
SELECT
CONVERT_TIMEZONE('Pacific/Honolulu', CURRENT_TIMESTAMP() !!!RESOLVE EWI!!! /*** SSC-EWI-TS0070 - CURRENT_TIMESTAMP in At Time Zone statement may have a different behavior in certain cases ***/!!!);
결과¶
2024-02-08 06:53:46.994 -1000
모범 사례¶
이는 Snowflake에서 동일한 형식을 유지하려는 경우의 예입니다.
SQL 서버¶
SELECT current_timestamp at time zone 'Hawaiian Standard Time';
결과¶
2024-02-08 16:33:49.143 -10:00
Snowflake에서는 ALTER SESSION을 사용하여 기본 타임존을 변경합니다. 예를 들면 다음과 같습니다.
Snowflake¶
ALTER SESSION SET TIMEZONE = 'Pacific/Honolulu';
SELECT
CONVERT_TIMEZONE('Pacific/Honolulu', 'UTC', CURRENT_TIMESTAMP());
결과¶
2024-02-08 16:33:49.143
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-EWI-TS0072¶
RETURN 문이 이전 RETURN 문으로 인해 무시됩니다.
심각도¶
낮음
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
설명¶
이 EWI는 SELECT 문 및 OUPUT 매개 변수가 반환되는 경우에 추가됩니다. 이 경우 SELECT 문의 결과 세트가 우선시됩니다.
입력 코드:¶
CREATE PROCEDURE SOMEPROC(@product_count INT OUTPUT, @123 INT OUTPUT)
AS
BEGIN
SELECT * from AdventureWorks.HumanResources.Department;
SELECT * from AdventureWorks.HumanResources.Employee;
END
생성된 코드:¶
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECTS "AdventureWorks.HumanResources.Department", "AdventureWorks.HumanResources.Employee" **
CREATE OR REPLACE PROCEDURE SOMEPROC (PRODUCT_COUNT OUT INT, _123 OUT INT)
RETURNS ARRAY
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "transact", "convertedOn": "07/16/2025", "domain": "no-domain-provided" }}'
EXECUTE AS CALLER
AS
$$
DECLARE
ProcedureResultSet1 VARCHAR;
ProcedureResultSet2 VARCHAR;
return_arr ARRAY := array_construct();
BEGIN
ProcedureResultSet1 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:ProcedureResultSet1) AS
SELECT
*
from
AdventureWorks.HumanResources.Department;
return_arr := array_append(return_arr, :ProcedureResultSet1);
ProcedureResultSet2 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:ProcedureResultSet2) AS
SELECT
*
from
AdventureWorks.HumanResources.Employee;
return_arr := array_append(return_arr, :ProcedureResultSet2);
--** SSC-FDM-0020 - MULTIPLE RESULT SETS ARE RETURNED IN TEMPORARY TABLES **
RETURN return_arr;
END;
$$;
모범 사례¶
무시해야 하는 RETURN 문을 제거합니다.
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
관련 EWI¶
SSC-FDM-0020: 여러 결과 세트가 임시 테이블에 반환됩니다.
SSC-EWI-TS0073¶
Snowflake에서는 오류 메시지가 다를 수 있음
참고
이 EWI는 더 이상 사용되지 않습니다. SSC-FDM-TS0023 설명서를 참조하세요.
심각도¶
낮음
설명¶
이 EWI는 ERROR_MESSAGE()의 변환에 추가됩니다. 오류의 정확한 메시지는 Snowflake에서 변경될 수 있습니다.
입력 코드:¶
SET @varErrorMessage = ERROR_MESSAGE()
생성된 코드¶
BEGIN
VARERRORMESSAGE := SQLERRM !!!RESOLVE EWI!!! /*** SSC-EWI-TS0073 - ERROR MESSAGE COULD BE DIFFERENT IN SNOWFLAKE ***/!!!;
END;
권장 사항¶
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-EWI-TS0074¶
종속성 누락으로 인해 캐스트 결과가 TRY_CAST 및 TRY_CONVERT 함수와 다를 수 있습니다
심각도¶
낮음
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
설명¶
이 EWI는 TRY_CAST 및 TRY_CONVERT 함수 변환 시 추가됩니다. 이러한 함수의 정확한 결과는 종속성 누락으로 인해 Snowflake에서 변경될 수 있습니다(SnowConvert AI가 일부 데이터 타입을 확인할 수 없음). 이는 소스 코드에 종속성이 없기 때문일 수 있습니다.
입력 코드:¶
SELECT TRY_CONVERT( INT, col1) FROM TABLE1;
SELECT TRY_CAST(COL1 AS FLOAT) FROM TABLE1
생성된 코드¶
SELECT
CAST(col1 AS INT) /*** SSC-FDM-TS0005 - TRY_CONVERT/TRY_CAST COULD NOT BE CONVERTED TO TRY_CAST ***/!!!RESOLVE EWI!!! /*** SSC-EWI-TS0074 - CAST RESULT MAY BE DIFFERENT FROM TRY_CONVERT FUNCTION DUE TO MISSING DEPENDENCIES ***/!!!
FROM
TABLE1;
SELECT
CAST(COL1 AS FLOAT) /*** SSC-FDM-TS0005 - TRY_CONVERT/TRY_CAST COULD NOT BE CONVERTED TO TRY_CAST ***/!!!RESOLVE EWI!!! /*** SSC-EWI-TS0074 - CAST RESULT MAY BE DIFFERENT FROM TRY_CAST FUNCTION DUE TO MISSING DEPENDENCIES ***/!!!
FROM
TABLE1;
권장 사항¶
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-EWI-TS0075¶
기본 제공 프로시저가 지원되지 않습니다
심각도¶
Medium
설명¶
기본 제공 프로시저에 대한 변환은 현재 지원되지 않습니다.
코드 예시¶
입력 코드:¶
EXEC sp_column_privileges_rowset_rmt 'Caption';
생성된 코드:¶
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0075 - TRANSLATION FOR BUILT-IN PROCEDURE 'sp_column_privileges_rowset_rmt' IS NOT CURRENTLY SUPPORTED. ***/!!!
EXEC sp_column_privileges_rowset_rmt 'Caption';
모범 사례¶
최종 사용자 작업이 필요하지 않습니다.
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-EWI-TS0076¶
기본 매개 변수를 재정렬해야 할 수 있습니다
참고
이 EWI는 더 이상 사용되지 않습니다. SSC-EWI-0002 설명서를 참조하세요.
심각도¶
Medium
설명¶
기본 매개 변수를 재정렬해야 할 수도 있습니다. Snowflake는 매개 변수 선언 끝에 있는 기본 매개 변수만 지원합니다.
코드 예시¶
입력 코드:¶
CREATE PROCEDURE MySampleProc
@Param1 NVARCHAR(50) = NULL,
@Param2 NVARCHAR(10),
@Param3 NVARCHAR(10) = NULL,
@Param4 NVARCHAR(10)
AS
SELECT 1;
생성된 코드:¶
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0076 - DEFAULT PARAMETERS MAY NEED TO BE REORDERED. SNOWFLAKE ONLY SUPPORTS DEFAULT PARAMETERS AT THE END OF THE PARAMETERS DECLARATIONS. ***/!!!
CREATE OR REPLACE PROCEDURE MySampleProc (PARAM1 STRING DEFAULT NULL, PARAM2 STRING, PARAM3 STRING DEFAULT NULL, PARAM4 STRING)
RETURNS TABLE()
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
ProcedureResultSet RESULTSET;
BEGIN
ProcedureResultSet := (
SELECT 1);
RETURN TABLE(ProcedureResultSet);
END;
$$;
모범 사례¶
최종 사용자 작업이 필요하지 않습니다.
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-EWI-TS0077¶
데이터 정렬이 지원되지 않습니다
심각도¶
낮음
설명¶
이 메시지는 Snowflake에서 지원되지 않는 collate 절이 있는 경우에 표시됩니다.
코드 예제¶
입력 코드:¶
SELECT 'a' COLLATE Albanian_BIN;
SELECT 'a' COLLATE Albanian_CI_AI;
CREATE TABLE ExampleTable (
ID INT,
Name VARCHAR(50) COLLATE collateName
);
생성된 코드:¶
SELECT 'a'
-- !!!RESOLVE EWI!!! /*** SSC-EWI-TS0077 - COLLATION Albanian_BIN NOT SUPPORTED ***/!!!
-- COLLATE Albanian_BIN
;
SELECT 'a'
-- !!!RESOLVE EWI!!! /*** SSC-EWI-TS0077 - COLLATION Albanian_CI_AI NOT SUPPORTED ***/!!!
-- COLLATE Albanian_CI_AI
;
CREATE OR REPLACE TABLE ExampleTable (
ID INT,
Name VARCHAR(50)
-- !!!RESOLVE EWI!!! /*** SSC-EWI-TS0077 - COLLATION collateName NOT SUPPORTED ***/!!!
-- COLLATE collateName
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
;
모범 사례¶
추가 사용자 작업이 필요하지 않습니다.
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-EWI-TS0078¶
기본값은 Snowflake에서 허용되지 않습니다.
심각도¶
Medium
설명¶
이 오류는 함수 호출, 변수 이름 또는 명명된 상수와 같은 식이 기본 옵션 뒤에 올 때 코드에 추가됩니다.
Snowflake는 숫자 또는 문자열과 같은 명시적 상수만 지원합니다.
코드 예제¶
입력 코드:¶
ALTER TABLE
T_ALTERTABLETEST
ADD
COLUMN COL10 INTEGER DEFAULT RANDOM(10);
생성된 코드:¶
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECTS "T_ALTERTABLETEST", "RANDOM" **
ALTER TABLE IF EXISTS T_ALTERTABLETEST
ADD
COLUMN COL10 INTEGER
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0078 - DEFAULT OPTION NOT ALLOWED IN SNOWFLAKE ***/!!!
DEFAULT RANDOM(10);
¶
모범 사례¶
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-EWI-TS0079¶
데이터베이스 콘솔 명령은 지원되지 않습니다
심각도¶
Medium
설명¶
이 EWI은 SnowConvert AI가 입력 코드 내부에서 DBCC 문을 발견한 경우 추가됩니다. 대부분의 DBCC 문은 Snowflake에서 지원되지 않습니다.
코드 예제¶
입력 코드:¶
DBCC CHECKIDENT(@a, RESEED, @b) WITH NO_INFOMSGS
생성된 코드:¶
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0079 - DATABASE CONSOLE COMMAND 'CHECKIDENT' IS NOT SUPPORTED. ***/!!!
DBCC CHECKIDENT(@a, RESEED, @b) WITH NO_INFOMSGS;
모범 사례¶
추가 사용자 작업이 필요하지 않습니다. 이는 단지 정보 제공용입니다.
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-EWI-TS0080¶
런타임 시 실행 컨텍스트 변경은 Snowflake에서 지원되지 않습니다
심각도¶
높음
설명¶
SQL Server의 사용자는 실행 컨텍스트를 일시적으로 변경하기 위해 EXECUTE AS 명령을 사용할 수 있는데, 이로 인해 실행 권한이 수정되고 USER_NAME()과 같은 컨텍스트 종속 함수의 결과에 영향을 미칩니다. REVERT 명령을 사용하여 이전의 컨텍스트를 마지막 EXECUTE AS로 복원할 수 있습니다.
Snowflake는 CREATE PROCEDURE 또는 ALTER PROCEDURE 문을 사용하여 프로시저에서 실행 컨텍스트 정의만 지원합니다. 런타임 시 컨텍스트 변경은 지원되지 않습니다.
코드 예제¶
입력 코드:
CREATE PROCEDURE proc1()
WITH EXECUTE AS OWNER
AS
BEGIN
SELECT USER_NAME();
EXECUTE AS CALLER;
SELECT USER_NAME();
REVERT;
SELECT USER_NAME();
END
GO
출력 코드:
CREATE OR REPLACE PROCEDURE proc1 ()
RETURNS ARRAY
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "transact", "convertedOn": "07/05/2024" }}'
EXECUTE AS OWNER
AS
$$
DECLARE
ProcedureResultSet1 VARCHAR;
ProcedureResultSet2 VARCHAR;
ProcedureResultSet3 VARCHAR;
return_arr ARRAY := array_construct();
BEGIN
ProcedureResultSet1 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:ProcedureResultSet1) AS
SELECT
CURRENT_USER();
return_arr := array_append(return_arr, :ProcedureResultSet1);
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0080 - CHANGING THE EXECUTION CONTEXT AT RUNTIME IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
EXECUTE AS CALLER;
ProcedureResultSet2 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:ProcedureResultSet2) AS
SELECT
CURRENT_USER();
return_arr := array_append(return_arr, :ProcedureResultSet2);
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0080 - CHANGING THE EXECUTION CONTEXT AT RUNTIME IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
REVERT;
ProcedureResultSet3 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:ProcedureResultSet3) AS
SELECT
CURRENT_USER();
return_arr := array_append(return_arr, :ProcedureResultSet3);
--** SSC-FDM-0020 - MULTIPLE RESULT SETS ARE RETURNED IN TEMPORARY TABLES **
RETURN return_arr;
END;
$$;
모범 사례¶
컨텍스트를 전환하지 않고도 작동하도록 코드를 리팩터링합니다.
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-EWI-TS0081¶
DELETE 문에서 FULL JOIN을 사용하는 것은 지원되지 않습니다
설명¶
DELETE 문을 변환할 때 SnowConvert AI는 해당 문의 FROM 절에서 찾은 테이블 참조를 추출하여 Snowflake DELETE 문의 USING 절로 이동합니다.
원본 코드에 사용된 LEFT 및 RIGHT JOINs를 유지하기 위해 OUTER JOIN 구문(+)이 조건에 추가되어 이러한 동작을 나타냅니다. 그러나 Snowflake에서는 (+) 구문을 사용하여 FULL JOINs를 나타낼 수 없습니다. 이 EWI는 이러한 제한 사항을 경고하기 위해 사용됩니다.
코드 예시¶
입력 코드:¶
DELETE Employees
FROM Employees FULL OUTER JOIN Departments
ON Employees.DepartmentID = Departments.DepartmentID
WHERE Departments.DepartmentID IS NULL;
생성된 코드:¶
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0081 - USING A FULL JOIN IN A DELETE STATEMENT IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
DELETE FROM
Employees
USING Departments
WHERE
Departments.DepartmentID IS NULL
AND Employees.DepartmentID = Departments.DepartmentID;
모범 사례¶
FULL JOIN의 논리를 확인합니다. 다른 JOIN 유형으로 다시 작성할 수 있습니다. 예를 들어, 예제 코드에 포함된 코드는 기본적으로 LEFT JOIN과 동일합니다.
입력:
DELETE Employees
FROM Employees LEFT OUTER JOIN Departments
ON Employees.DepartmentID = Departments.DepartmentID
WHERE Departments.DepartmentID IS NULL;
출력:
DELETE FROM
Employees
USING Departments
WHERE
Departments.DepartmentID IS NULL
AND Employees.DepartmentID = Departments.DepartmentID(+);
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-EWI-TS0082¶
CROSS APPLY가 LEFT OUTER JOIN으로 변환되었으며 수동 유효성 검사가 필요합니다.
설명¶
CROSS APPLY에서 LEFT OUTER JOIN으로 변환되면 Snowflake에서 잘못된 결과나 예기치 않은 동작이 발생할 수 있으므로 수동 유효성 검사가 필요합니다. 두 함수는 비슷해 보일 수 있지만, 특히 하위 쿼리에 일치하는 항목이 없거나 하위 쿼리가 외부 테이블과 상관 관계가 있는 경우 특정 상황을 다르게 처리합니다.
코드 예시¶
설정 데이터¶
-- Create a table to store monthly sales or metric data
CREATE TABLE sales_metrics (
metric_id INT PRIMARY KEY,
january_value VARCHAR(35),
february_value VARCHAR(35),
march_value VARCHAR(35)
);
-- Insert sample data
INSERT INTO sales_metrics (metric_id, january_value, february_value, march_value) VALUES
(1, 'sales-jan-1', 'sales-feb-1', 'sales-march-1'),
(2, 'sales-jan-2', 'sales-feb-2', 'sales-march-2');
입력 코드:¶
SELECT
m.metric_id,
monthly_data.metric_value,
monthly_data.month_number
FROM
sales_metrics m
CROSS APPLY (
SELECT m.january_value AS metric_value, '01' AS month_number
UNION ALL
SELECT m.february_value AS metric_value, '02' AS month_number
UNION ALL
SELECT m.march_value AS metric_value, '03' AS month_number
) AS monthly_data;
생성된 코드:¶
SELECT
m.metric_id,
monthly_data.metric_value,
monthly_data.month_number
FROM
sales_metrics m
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0082 - CROSS APPLY HAS BEEN CONVERTED TO LEFT OUTER JOIN AND REQUIRES MANUAL VALIDATION. ***/!!!
LEFT OUTER JOIN
(
SELECT
m.january_value AS metric_value, '01' AS month_number
UNION ALL
SELECT
m.february_value AS metric_value, '02' AS month_number
UNION ALL
SELECT
m.march_value AS metric_value, '03' AS month_number
) AS monthly_data;
모범 사례¶
LEFT OUTER JOIN이 실패할 수 있는 주요 시나리오¶
필터링 동작: 원래
CROSS APPLY는 기본 테이블에서 하위 쿼리에 일치 항목이 없는 행을 필터링하기 위한 것이며,LEFT OUTER JOIN은 이 동작을 복제하지 않습니다. 대신, 조인된 열에NULL값이 있는 행을 포함하며, 이는 의도한 결과가 아닐 수 있습니다.상관 관계가 있는 하위 쿼리:
CROSS APPLY는 하위 쿼리가 외부 쿼리의 열을 참조하는 상관 관계가 있는 하위 쿼리를 지원하도록 특별히 설계되었습니다. 표준LEFT OUTER JOIN은 동일한 방식으로 이 패턴을 지원하지 않습니다. 상관 관계가 있는CROSS APPLY를LEFT OUTER JOIN으로 변환하려고 시도하면 구문 오류, 데카르트 곱(중복 행) 또는 논리적으로 잘못된 결과가 발생할 수 있습니다.결과 세트 차이점:
CROSS APPLY및LEFT OUTER JOIN의 의미 체계는 다르며, 특히 하위 쿼리가 행을 반환하지 않는 경우에는 더욱 그렇습니다.CROSS APPLY는 이러한 행을 결과에서 제외하지만,LEFT OUTER JOIN은NULL값이 있는 행을 포함합니다.
권장 사항: 항상 CROSS APPLY가 LEFT OUTER JOIN으로 변환된 쿼리의 출력을 검토하고 테스트하여 정확성을 보장합니다.
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-EWI-TS0083¶
Error Message¶
ROLLBACK TRANSACTION requires the appropriate setup to work as intended.
심각도¶
Low
설명¶
This EWI is generated when a ROLLBACK TRANSACTION statement is encountered, indicating that SnowConvert has successfully transformed the statement into a Snowflake-compatible format. However, the transformation requires manual verification because Snowflake’s transaction rollback behavior differs significantly from SQL Server’s ROLLBACK TRANSACTION functionality.
코드 예시¶
Input (SQL Server):¶
BEGIN TRANSACTION MyTransaction;
-- Some operations
INSERT INTO Employees (Name, Department) VALUES ('Alice', 'Engineering');
IF @@ERROR <> 0
BEGIN
ROLLBACK TRANSACTION MyTransaction; -- Named transaction rollback
END
ELSE
BEGIN
COMMIT TRANSACTION MyTransaction;
END
Output (Snowflake Scripting):¶
BEGIN
!!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'BeginTransaction' NODE ***/!!!
BEGIN TRANSACTION MyTransaction;
-- Some operations
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "Employees" **
INSERT INTO Employees (Name, Department) VALUES ('Alice', 'Engineering');
IF (:ERROR <> 0) THEN
BEGIN
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0083 - ROLLBACK TRANSACTION REQUIRES THE APPROPRIATE SETUP TO WORK AS INTENDED. ***/!!!
ROLLBACK TRANSACTION MyTransaction; -- Named transaction rollback
END;
ELSE
BEGIN
COMMIT;
END;
END IF;
END;
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.