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



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

它真的很古怪,因为我的一些插页有效,有些无效。

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

更新:当我将多行t-sqlSelect编辑为一行语句时,也会发生同样的事情@str,在跟踪代码时,通常是空白的,而它似乎不应该是空白的。。。(@str.的第二个实例。。。选择@str='插入到CustShip值中('+'''+@A_Cust_No+''','+'',+@Ship_To_Id+''',3('EXEC(@str(选择@str='Insert into ShipTo Values….'此Second@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

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

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

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

同样,正如HABO在上面所说的,这些变量中的任何一个null值都会使整个字符串为null。合并或执行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

最新更新