Tsql跨多行设置字符串变量

时间:2018-07-24 02:42:01

标签: tsql syntax

这真是奇怪。 当我遍历此代码时,在第一条语句上,当我将@str编码为单行时,它会成为有效的插入语句,但是当我通过select语句设置@str时,如果跨越多行,它将不具有任何值

它真的很容易加工,因为我的一些插件可以用,而有些则不能。

有什么想法如何跨多行正确设置变量?还是这是Microsoft错误...?

更新:当我将多行t-sql Select编辑为一行语句时,也会发生同样的事情 @str在跟踪代码时经常变成空白,看起来好像不应该空白...(@ str的第二个实例...       选择@str ='插入CustShip值('+''''+ @A_Cust_No +''''+','+''''+ @Ship_To_Id +''''+',3)'        执行(@str)        选择@str ='插入ShipTo值....' 第二个@str通常被评估为空白...)

ALTER Procedure [dbo].[RefreshCustShip3]
AS
Begin   /* Begin Proc */
Set NoCount On

--Delete from CustShip

    DECLARE @SHIP_TO_NAME  VarChar(255),
            @A_Cust_No varchar(255),
            @SHIP_TO_ADD1 VarChar(255),
            @SHIP_TO_ADD2 VarChar(255),
            @SHIP_TO_ADD3 VarChar(255),
            @CITY VarChar(255),
            @STAT VarChar(255),
            @ZIP_Code VarChar(255),
            @SHIP_TO_ID VarChar(255),
            @COUNTRY VarChar(255),
            @ShipId varchar(255),
            @str varchar(1000)

    DECLARE C CURSOR FAST_FORWARD /* read only, forward only */ FOR
    SELECT 
    A#CUST#NO, 
    CUST#NAME as SHIP#TO#NAME, 
    SOLD#TO#ADD#1 AS SHIP#TO#ADD#1, 
    SOLD#TO#ADD#2 AS SHIP#TO#ADD2, 
    SOLD#TO#ADD#3 AS SHIP#TO#ADD3, 
    SOLD#TO#CITY AS CITY, 
    SOLD#TO#STATE AS [STATE], 
    SOLD#TO#ZIP#CODE AS ZIP#CODE, 
    CONCAT(LTRIM(RTRIM(A#CUST#NO)), LTRIM(RTRIM(SOLD#TO#ADD#1))) AS SHIP#TO#ID, 
    COUNTRY#NAME as Country 
    from Cust left join CustShip on 
    Cust.A#Cust#No = CustShip.CustNo 
    WHERE CustShip.ShipToID is Null

    OPEN C

    FETCH NEXT FROM C INTO @A_Cust_No, @Ship_To_Name, @SHIP_TO_ADD1, @SHIP_TO_ADD2, @SHIP_TO_ADD3, @CITY, @STAT, @ZIP_Code, @SHIP_TO_ID, @Country;

    WHILE @@FETCH_STATUS = 0
    BEGIN

        if @A_Cust_No = '3RGHOU' 
        begin
            print @Ship_To_Id
        end

    -- do work here BEGIN CODE BLOCK
       Select @str = 'Insert into CustShip Values (' + '''' + @A_Cust_No + '''' + ', ' + '''' +  @Ship_To_Id + '''' + ',3)'
       EXEC(@str)
       Select @str = 'Insert into ShipTo Values (' + '''' + @A_Cust_No + '''' + ', '
       + '''' +  @Ship_To_Name + '''' + ', '
       + '''' +  @Ship_To_Add1 + '''' + ', '
       + '''' +  @Ship_To_Add2 + '''' + ', '
       + '''' +  @Ship_To_Add3 + '''' + ', '
       + '''' +  @City + '''' + ', '
       + '''' +  @Stat + '''' + ', '
       + '''' +  @ZIP_Code + '''' + ', '
       + '''' +  @Ship_To_Id + '''' + ', '
       + '''' +  @Country + ''''       
       + ',3)'
       EXEC(@str)


        FETCH NEXT FROM C INTO @A_Cust_No, @Ship_To_Name, @SHIP_TO_ADD1, @SHIP_TO_ADD2, @SHIP_TO_ADD3, @CITY, @STAT, @ZIP_Code, @SHIP_TO_ID, @Country;
    End

    CLOSE C;

    DEALLOCATE C;

End     /* End Proc */


GO

2 个答案:

答案 0 :(得分:1)

我在这里大声思考。通过查看您的SQL,是否有可能超出@Str上的VARCHAR(1000)限制?您正在创建一个包含10个变量的字符串,每个变量可以包含255个字符。如果没有插入语句语法,则总共为2550个字符。

此外,由于您只是将字符串分配给单个变量,因此应使用SET而不是SELECT。

另外,在字符串末尾的EXEC语句之前放置一个分号语句终止符。

就像HABO上面所说的那样,这些变量中的任何一个都为null值会使整个字符串为null。合并或执行ISNULL(@CITY, '')将解决此问题。

答案 1 :(得分:0)

我认为这是最好的答案,尽管这要感谢其他引导我走向足迹的海报。他们应该得到信誉。不知道是否有办法给他们信誉。...

   -- do work here BEGIN CODE BLOCK
       Select @str = 'Insert into CustShip Values (' + '''' + @A_Cust_No + '''' + ', ' + '''' +  @Ship_To_Id + '''' + ',3)'
       EXEC(@str)
       Select @str2 = 'Insert into ShipTo Values (' + 
       iif(@A_Cust_No is Null, 'Null', '''' + Replace(@A_Cust_No,'''','''''') + '''') 
       + ', ' + 
       iif(@Ship_To_Name is Null, 'Null', '''' + Replace(@Ship_To_Name,'''','''''') + '''') + ', ' + 
       iif(@Ship_To_Add1 is Null, 'Null', '''' + Replace(@Ship_To_Add1,'''','''''') + '''') + ', ' + 
       iif(@Ship_To_Add2 is Null, 'Null', '''' + Replace(@Ship_To_Add2,'''','''''') + '''') + ', ' + 
       iif(@Ship_To_Add3 is Null, 'Null', '''' + Replace(@Ship_To_Add3,'''','''''') + '''') + ', ' + 
       iif(@City is Null, 'Null', '''' + Replace(@City,'''','''''') + '''') + ', ' + 
       iif(@Stat is Null, 'Null', '''' + Replace(@Stat,'''','''''') + '''') + ', ' + 
       iif(@Zip_Code is Null, 'Null', '''' + Replace(@Zip_Code,'''','''''') + '''') + ', ' + 
       iif(@Ship_To_Id is Null, 'Null', '''' + Replace(@Ship_To_Id,'''','''''') + '''') + ', ' + 
       iif(@Country is Null, 'Null', '''' + Replace(@Country,'''','''''') + '''') + ', 3)' 

       EXEC(@str2)


        FETCH NEXT FROM C INTO @A_Cust_No, @Ship_To_Name, @SHIP_TO_ADD1, @SHIP_TO_ADD2, @SHIP_TO_ADD3, @CITY, @STAT, @ZIP_Code, @SHIP_TO_ID, @Country;
    End