Repeatable error, with script, with code

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Matt

    Repeatable error, with script, with code

    Hello

    I have spent the last weeks trying to solve this problem but with no
    luck at all, I have a piece of code that looks like this


    declare @bestnr int,
    @artnr varchar(25),
    @journalnrrow int,
    @bestlevant decimal,
    @vb_inpris money

    set @bestnr = 33434
    set @artnr = '1441'
    set @journalnrrow = 11
    set @bestlevant = 50
    set @vb_inpris = 10


    insert into bpl (bestnr, artnr, jibpjournal, bestlevant, vb_inpris,
    bestlevantextqt y)
    values (@bestnr, @artnr, @journalnrrow, @bestlevant, @vb_inpris,
    @bestlevant)

    This code works just fine in query analyzer, but in SQL server agent
    it does not work it creates an error message about string or bnary
    data would be truncated, Simon suggested this has to do with
    ansi_warnings being OFF in query analyser and ON when SQL srver agent
    makes its connection.

    I have scripted my entire DB at


    That script creates all the deps and tables and triggers for our DB,
    any help would be appreciated, I just don't know where to turn, we
    have hired a consultant but that did not help either as he could not
    solve the problem.

    If anyone know a good sql consultant in sweden that might have a clue
    about this, please let us know we are getting pretty desperate.

    Regards

    Matt
  • Hugo Kornelis

    #2
    Re: Repeatable error, with script, with code

    On 18 Apr 2004 10:42:00 -0700, Matt wrote:
    [color=blue]
    >Hello
    >
    >I have spent the last weeks trying to solve this problem but with no
    >luck at all, I have a piece of code that looks like this
    >
    >
    >declare @bestnr int,
    > @artnr varchar(25),
    > @journalnrrow int,
    > @bestlevant decimal,
    > @vb_inpris money
    >
    >set @bestnr = 33434
    >set @artnr = '1441'
    >set @journalnrrow = 11
    >set @bestlevant = 50
    >set @vb_inpris = 10
    >
    >
    >insert into bpl (bestnr, artnr, jibpjournal, bestlevant, vb_inpris,
    >bestlevantextq ty)
    > values (@bestnr, @artnr, @journalnrrow, @bestlevant, @vb_inpris,
    >@bestlevant)
    >
    >This code works just fine in query analyzer, but in SQL server agent
    >it does not work it creates an error message about string or bnary
    >data would be truncated, Simon suggested this has to do with
    >ansi_warning s being OFF in query analyser and ON when SQL srver agent
    >makes its connection.[/color]

    Hi Matt,

    To begin with: Simon (Hayes?) is correct. The reason that you see this
    different behaviour is due to the settings Simon mentioned. These
    settings are provided for historic reasons.

    Previous versions of SQL Server had the feature of trimming strings
    that didn't fit the declared length of a variable or column without
    notice. For SQL Server 7.0, Microsoft wanted to certify as compliant
    with the SQL-92 standard. One of the things this standard proscribed
    was that trying to store a string in a columns with a shorter length
    is an error condition. In order to provide backwards compatibility,
    Microsoft supplied option that allow users to select the amount of
    ANSI compliancy. The behaviour on string truncation is governed by the
    ANSI_WARNINGS setting.

    Try the following in Query Analyzer to see what I mean:

    drop table test
    go
    create table test (try# int, shorttext varchar(6))
    go
    set ansi_warnings off
    insert into test select 1, convert ( varchar(30) ,
    COALESCE (SUser_SName () , 'XX' ) )
    go
    set ansi_warnings on
    insert into test select 2, convert ( varchar(30) ,
    COALESCE (SUser_SName () , 'XX' ) )
    go
    select * from test
    go


    [color=blue]
    >I have scripted my entire DB at
    >http://donald.fruitsalad.org/microsoft/entiredb.sql[/color]

    Boy, am I glad I'm no longer on a dialup connection - almost 100MB!!
    When I saw how long the download would take, I assumed you had lots of
    inserts embedded in the script, but I now see that it's just the DDL.
    You sure make some pretty complex databases.... :-|

    [color=blue]
    >That script creates all the deps and tables and triggers for our DB,
    >any help would be appreciated, I just don't know where to turn, we
    >have hired a consultant but that did not help either as he could not
    >solve the problem.[/color]

    I killed the osql process that executed your script after more than 30
    minutes, as I've already found the cause (though it's absolutely
    possible that there are more culprits).

    This line is taken from the create table statement for bpl:
    [perssign] [varchar] (6) COLLATE Finnish_Swedish _CI_AS NOT NULL ,

    This column has a default, specified in the (old and proprietary)
    Transact-SQL syntax:

    create default DefDbLoginId as convert ( varchar(30) ,
    COALESCE (SUser_SName () , 'XX' ) )
    GO
    (...)
    EXEC sp_bindefault N'[dbo].[DefDbLoginId]', N'[bpl].[perssign]'
    GO

    The default results in a varchar(30) value. You attempt to store this
    in a varchar(6) column. That's why the error gets raised if the ANSI
    warnings option is set to on.

    Some ways to get around this:
    a) Change the default DefDbLoginId - replace "varchar(30 )" with
    "varchar(6) " in the convert function call. (ANSI standards does permit
    truncation of strings in explicit conversions).
    b) Make sure you always run your code with ANSI warnings set to off.
    c) Change the maximum length of bpl.perssign to varchar(30).

    (*) Note on ANSI (and other) settings: a default for these settings
    can be set per database. This default can be overriden for each
    connection. Many tools (like Query Analyzer) will do so - the settings
    QA usses for each connection can be found (and changed) via menu
    option Query / Currenc Connection Properties and the defaults for new
    connection via Tools / Options / Connection Properties. Within the
    connection, the setting can be flipped as often as wanted with the SET
    command (like I did in the example above).

    [color=blue]
    >If anyone know a good sql consultant in sweden that might have a clue
    >about this, please let us know we are getting pretty desperate.[/color]

    In Sweden? No, sorry. I only know SQL consultants in the Netherlands.

    Best, Hugo
    --

    (Remove _NO_ and _SPAM_ to get my e-mail address)

    Comment

    Working...