Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Select top 1 from temp table returns only first character

In a T-SQL code block, I am populating a temp table and doing a WHILE loop. In the WHILE loop, when I do a SELECT TOP 1 for a varchar value, it returns only the first character.

Here is the code

BEGIN
    DECLARE @RowCounter int;
    SET @RowCounter = 0;

    DECLARE @TotalRows int;  
    SET @TotalRows = 0;

    DECLARE @tempPcsDataId int; 
    SET @tempPcsDataId = 0;

    -- create a temp table
    -- to stack people: PalletLicensePlate in the Db is varchar(50) so I make tempPalletLicensePlate the same
    DECLARE @DistinctPalletsTempTable TABLE 
            (
                 DeliveryDate datetime, 
                 tempPalletLicensePlate varchar(50), 
                 StoreNumber nvarchar(50), 
                 DerivedWmsCode nvarchar(20), 
                 ShipperClid int, 
                 CartonCount int
            );

    -- populate the temp table
    INSERT @DistinctPalletsTempTable 
        SELECT DISTINCT 
            DeliveryDate, PalletLicensePlate, StoreNumber, 
            DerivedWmsCode, ShipperClid, 0
        FROM
            PcsData 
        WHERE
            InsertGuid = '017DA918-3AF3-4F86-949C-C2611E2BEEE8';

    SET @TotalRows = (SELECT COUNT(*) FROM @DistinctPalletsTempTable);

    WHILE @TotalRows >= @RowCounter
    BEGIN
        DECLARE @CartonCountForThisPallet int; 
        SET @CartonCountForThisPallet = 0;

        DECLARE @ThisLicensePlate varchar;  
        SET @ThisLicensePlate = (SELECT TOP 1 tempPalletLicensePlate 
                                 FROM @DistinctPalletsTempTable);

        SELECT @ThisLicensePlate  -- this always returns B  The first character
        SET @CartonCountForThisPallet = (SELECT COUNT(*) 
                                         FROM PcsData 
                                         WHERE PalletLicensePlate = @ThisLicensePlate);

        UPDATE @DistinctPalletsTempTable 
        SET CartonCount = @CartonCountForThisPallet;

        SELECT @RowCounter;
        SELECT @TotalRows;

        SET @RowCounter = @RowCounter + 1;
    END

    SELECT * FROM @DistinctPalletsTempTable;
END

Here is a picture of select * from @DistinctPalletsTempTable; in the code above. You can see that tempPalletLicensePlate is a long string

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

enter image description here

How can I grab the complete tempPalletLicensePlate from the TOP 1 row?

>Solution :

Well – if you omit any length specification, a SQL variable declare as just varchar just default to 1 character length – this is defined, well documented behavior:

When n isn’t specified in a data definition or variable declaration statement, the default length is 1

so no surprise here, really….

And the solution is really simple, too – always explicitly define a length when using varchar as a datatype – for a variable, or a parameter ….

    DECLARE @ThisLicensePlate VARCHAR(50);  -- **DEFINE** then length here!

    SELECT TOP 1 @ThisLicensePlate = tempPalletLicensePlate 
    FROM @DistinctPalletsTempTable;

Now your @ThisLicensePlate will properly show the whole contents of the license plate! The problem really isn’t the SELECT TOP 1.... part – it’s the declaration of your SQL variable

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading