跨多行设置字符串变量的Tsql

跨多行设置字符串变量的Tsql,tsql,syntax,Tsql,Syntax,这真的很奇怪。 当我跟踪这段代码时,在第一条语句中,当@str被编码为一行时,我得到的是一个有效的insert语句,但当我通过select语句设置@str时,它跨多行,它的值为零 它真的很脆弱,因为我的一些插页起作用了,而一些没有 你知道如何跨多行正确设置变量吗?或者这是微软的错误 更新:当我将多行t-sql Select编辑为一行语句时,也会发生同样的情况 @在跟踪代码时,str通常是空的,而看起来它不应该是空的…(第二个@str实例。。。 选择@str='插入到保管值中('+''''+@A_

这真的很奇怪。 当我跟踪这段代码时,在第一条语句中,当@str被编码为一行时,我得到的是一个有效的insert语句,但当我通过select语句设置@str时,它跨多行,它的值为零

它真的很脆弱,因为我的一些插页起作用了,而一些没有

你知道如何跨多行正确设置变量吗?或者这是微软的错误

更新:当我将多行t-sql Select编辑为一行语句时,也会发生同样的情况 @在跟踪代码时,str通常是空的,而看起来它不应该是空的…(第二个@str实例。。。 选择@str='插入到保管值中('+''''+@A_Cust_No+''''+'''''+'''''+''+@Ship_To_Id+'+'''+',3)' 执行官(@str) 选择@str='插入ShipTo值….' 第二个@str的计算结果通常为空……)


我在大声思考。从您的SQL来看,是否有可能您在@Str上运行的VARCHAR(1000)超过了您的限制?您正在创建一个包含10个变量的字符串,每个变量可以包含255个字符。如果没有insert语句语法,总共有2550个字符

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

此外,在EXEC语句之前的字符串结尾后放置分号语句终止符


正如HABO在上面所说的,这些变量中的任何一个空值都会使整个字符串无效。联合或执行
ISNULL(@CITY,”)
可以解决这个问题。

我认为这是最好的答案,尽管非常感谢其他引导我找到线索的海报。他们值得赞扬。不确定是否有办法给予他们信任

   -- 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

这可以很好地解释这种不一致性和片状。如果它只是崩溃了,那就比什么都没有好了。。。。我会检查它…正如HABO在上面所说的,任何变量中的空值都会使整个字符串无效。合并或执行ISNULL(@CITY'')可以解决这个问题。如果你有一个
null
,你会得到一个
null
。尝试用
合并(@Ship\u To\u Name,”)包装变量
。旁白:如果您为引号创建了一个变量,可能更容易阅读,例如
将@Quote声明为Char(1)='',并根据需要使用该代码<代码>将@QuoteComma声明为Char(2)=@Quote+','可能也没什么坏处。如果你将Coalesce作为答案发布,我会将其标记为答案。如果没有,我会给罗布信用卡。我编辑了他的帖子,加入了你的答案。旁白:不清楚你到底想实现什么。您发布的代码似乎正在执行两个
insert。。。选择将数据从一个表复制到另一个表的…
语句。您还通过不使用参数创建了opportunity。
insert
的最佳实践是提供列列表,例如
insert-into-CustShip(CustNo)值(@CustNo)
   -- 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