这真的很奇怪。当我跟踪这段代码时,在第一条语句上,当它被编码为单行时,我会得到@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