SQL Server迁移时计算列IF语法报错问题求助
SQL Server计算列IF语法报错的解决办法
SAP将停用原有SQL环境,我正在开发迁移工具将数据转至SQL Server。创建包含计算列的A_Invoices表时,SQL Server报错:
Incorrect syntax near the keyword 'if'
修改数据类型后的建表语句如下:
CREATE TABLE A_Invoices ( Invoice_ID int NOT NULL IDENTITY(1,1) PRIMARY KEY, Invoice_No int, Type varchar(2), Invoice_Date date, Transaction_Date date DEFAULT GETDATE(), Customer_ID int, Customer_Name varchar(100), Nominal_ID int, Add1 varchar(100), Add2 varchar(200), City varchar(100), State varchar(2), Zip varchar(15), Terms varchar(100), Amount_Net float, Amount_Tax float, Amount_Gross float, Tax_Rate float(53), Tax_Code varchar(2), Settlement_Due_Days int, Settlement_Discount_Rate float(53) DEFAULT 0.0, Settlement_Discount_Amount AS IF "Settlement_Discount_Rate" > 0 THEN ("Amount_Net"*"Settlement_Discount_Rate") / 100 ELSE 0.0 ENDIF, Printed varchar(1) DEFAULT 'N', Posted varchar(1) DEFAULT 'N', Flag_Prepayment varchar(1) DEFAULT 'N', Prepayment_Months int DEFAULT 0, Prepayment_Amount float DEFAULT 0.0, Flag_Deposit varchar(1) DEFAULT 'N', Flag_Ad_Hoc varchar(1) DEFAULT 'N', Customer_Order_No varchar(50), Details varchar(100), Pay_Due_Days int DEFAULT 0, Open_Editing int DEFAULT 0, Editing_Name varchar(100) DEFAULT 'System', Updated_Name varchar(100) DEFAULT 'System', Updated DateTime2 DEFAULT GETDATE() );
更新说明
语句中的双引号来自SQL Anywhere的查询语句,多数表由早期版本SQL Anywhere升级而来,对应的元数据查询语句如下:
SELECT c.column_name AS 'Name', c.base_type_str AS 'Type', c.nulls AS 'Nulls', c.`default` AS 'Default' FROM systabcol c KEY JOIN systab t ON t.table_name = 'vTB'
解决办法
目前问题已解决,针对IF语法的转换处理代码如下:
If vComputed = "C" Then vMSComputed = "Y" If vDefault.Contains("if") Then Dim s As New System.Text.StringBuilder(vDefault) s.Replace("if", "CASE WHEN", 0, 2) s.Replace("endif", "END", 0, s.Length) s.Replace("""", "") vMSDefault = s.ToString End If Else vMSComputed = "N" End If
另外,针对创建表时提示表已存在的问题,使用以下语句判断后再执行建表操作:
IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'vTable')
内容的提问来源于stack exchange,提问作者gchq
相关产品推荐
相关产品推荐

