INSERT 失败,因为以下 SET 选项仅在 Perl Sybase 中的设置不正确

Posted

技术标签:

【中文标题】INSERT 失败,因为以下 SET 选项仅在 Perl Sybase 中的设置不正确【英文标题】:INSERT failed because the following SET options have incorrect setting only in Perl Sybase 【发布时间】:2014-06-04 05:14:37 【问题描述】:

我有以下 Perl 脚本:

use strict;
use warnings;
use DBI;

my $db_connect = 'dbi:Sybase:server=10.2.2.2\CATDB;charset=utf8;database=Dev';
my $db_username = "*****";
my $db_password = "*****";

my $dbh = DBI->connect($db_connect, $db_username, $db_password, RaiseError => 1, 
            PrintError => 1, 
            AutoCommit => 1,
            syb_chained_txn => 0, 
            syb_enable_utf8 => 1   ) || die "Failed to connect to BORIS database: $DBI::errstr\n";

my $insertContractSQL2 = '
BEGIN
DECLARE @ContractID int
UPDATE dbo.Sequences SET NextContractID = NextContractID + 1
SET @ContractID = (SELECT NextContractID FROM dbo.Sequences)

SET ANSI_NULL_DFLT_ON, ANSI_NULLS, ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, CONCAT_NULL_YIELDS_NULL, QUOTED_IDENTIFIER ON
SET ANSI_NULL_DFLT_OFF, ARITHIGNORE, CURSOR_CLOSE_ON_COMMIT, IMPLICIT_TRANSACTIONS, NOCOUNT, NUMERIC_ROUNDABORT, XACT_ABORT OFF

INSERT INTO dbo.CONTRACTS 
            (ContractID
            ,modifieddate
            ,FranchiseID
            ,FamilyID
            ,EducatorID
            ,StartDate
            ,EndDate
            ,ContractTypeID
            ,PayRate1
            ,PayRate2
            ,PayRate3
            ,PayRate1Hours
            ,PayRate2Hours
            ,PayRate3Hours
            ,WageAdminContractorRate
            ,PorseContributionContractorRate
            ,WageAdminAmount
            ,ACCAmount
            ,PorseContributionAmount
            ,WINZSubsidyAmount
            ,WINZSubsidyAmountChildcareOSCAR
            ,ACCInvoicedPerQuarterAmount
            ,FamilyAPAmount
            ,OtherFortnightPayment
            ,OtherFortnightPaymentDesc
            ,ReferralAgencyID
            ,NextAppraisalDate
            ,NextAppraisalTypeID
            ,PendingApproval
            ,Active
            ,modifiedby
            ,BeingEdited
            ,MOENetworkID
            ,NewFlag
            ,ReceivedDate
            ,FreeECEAmount
            ,OptionalChargeRate
            ,OptionalChargeAgreement
            ,TerminationApproved
            ,AgreedDeductions
            ,PayRateEce
            ,PayRateEceHours
            ,PreECEClarity
            ,TotalOptionalCharges
            ,NonChildPorseContributionAmount
            ,FreeECETopup
            ,Donation
            ,NonChildWinzChildcareAmount
            ,ManuallyTerminated
            ,ContractDuplicatedFlag
            ,CreateDate
            ,RosteredContractID)
            VALUES (
             @ContractID
            ,GETDATE()
            ,63,22901,9134,\'2014-06-03 00:00:00.0\',\'2014-06-28 00:00:00.0\',2,0,0,0,5,0,0,4.75,0,0,0,0,0,0,0,0,0,null,null,null,null,0,1,\'admin\',1,null,0,\'2014-06-10 00:00:00.0\',0,0,0,0,null,0,0,0,0,0,0,0,0,0,0,\'2014-06-03 15:30:15.037\',4)

END  
';

 $dbh->do($insertContractSQL2);

当它运行时,我得到:

/usr/bin/perl test.pl
DBD::Sybase::db do failed: Server message number=1934 severity=16 state=1 
    line=10 server=BOBSTER\BOBSTER1 text=INSERT failed because the
    following SET options have incorrect settings: 'ANSI_NULLS, 
    CONCAT_NULL_YIELDS_NULL, ANSI_WARNINGS, ANSI_PADDING'. Verify that 
    SET options are correct for use with indexed views and/or indexes on 
    computed columns and/or filtered indexes and/or query notifications 
    and/or XML data type methods and/or spatial index operations.  
    at test.pl line 89.

现在我知道这是一个糟糕的问题。但是我已经通过 SQL Server 的三个不同 GUI 运行了相同的查询,但没有收到此错误。我浏览了谷歌搜索结果的前 3 或 4 页,但一无所获。任何信息将不胜感激。

注意:我假设因为查询在其他设置选项的工具中运行是正确的

【问题讨论】:

如果您使用SQL Server,请查看我在Failed because incorrect arithabort setting 页面上的回答。希望这会有所帮助... 【参考方案1】:

请参考this link,您可能需要设置顺序来创建具有持久计算列的表,必须启用以下连接设置:

SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
SET ARITHABORT ON
SET CONCAT_NULL_YIELDS_NULL ON
SET NUMERIC_ROUNDABORT ON
SET QUOTED_IDENTIFIER ON

您可以使用 $sth->do() 方法或使用 ISQL 来设置它。在连接到数据库后,您需要先执行它们,然后再执行“SELECT”、“UPDATE”或任何其他命令。

【讨论】:

谢谢,是的,它应该是这样工作的。然而这并没有帮助。 如果你直接在 db 上执行 insertContractSQL2 语句,你会得到任何错误吗? 不,我没有收到任何错误。这个缺失的部分是该集合必须是首先执行的。把这个第一个 $boris_dbh->do(' SET ANSI_NULL_DFLT_ON, ANSI_NULLS, ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, CONCAT_NULL_YIELDS_NULL, QUOTED_IDENTIFIER ON SET ANSI_NULL_DFLT_OFF, ARITHIGNORE, CURSOR_CLOSE_ON_COMMIT, IMPLICIT_TRANSACTIONS, NOCOUNT_ROUND_BORT_BORT修好了。 啊,我明白了。是的,SET 应该是连接 DB 后的第一件事。 现在我有一个简单的例子。但是当我尝试在真实代码中做同样的事情时,它会中断。这不是我的日子...【参考方案2】:

我用这种讨厌的方式解决了它:

EXEC('
    IF EXISTS(SELECT * FROM sysindexes WHERE Name = ''IX_GPS_XY'') 
        DROP INDEX [IX_GPS_XY] ON [dbo].[Cities];
')
EXEC('
    INSERT INTO dbo.Cities(Name, CountyID, GPSXY) 
    VALUES...
')
EXEC('
    IF NOT EXISTS(SELECT * FROM sysindexes WHERE Name = ''IX_GPS_XY'') BEGIN
        SET ARITHABORT ON;
        ...
        CREATE SPATIAL INDEX...
')

【讨论】:

【参考方案3】:

我运行了一个由 SQL Server studio 生成的脚本,但出现错误“插入失败,因为以下 SET 选项的设置不正确:'ANSI_PADDING'”

我的解决方案是添加关键字“GO”并且脚本有效。

有错误的脚本:

--SOME INSERT STATEMENTS
SET ANSI_PADDING ON

--SOME INSERT STATEMENTS

有效的脚本:

--SOME INSERT STATEMENTS
SET ANSI_PADDING ON
GO
--SOME INSERT STATEMENTS

希望对你有帮助。

【讨论】:

以上是关于INSERT 失败,因为以下 SET 选项仅在 Perl Sybase 中的设置不正确的主要内容,如果未能解决你的问题,请参考以下文章

如何解决“选择失败,因为以下 SET 选项的设置不正确:'ANSI_PADDING'。”错误

删除所有表时出错“删除失败,因为以下 SET 选项的设置不正确:'QUOTED_IDENTIFIER'”

在 SQL Server 2005 中恢复 SQL Server 2014 数据库

由于设置不正确,触发器内部更新失败

选项(失败)仅在 Chrome 和 Firefox 上

C++ std::set insert 失败 原因和解决方案 operator