这真是奇怪。 当我遍历此代码时,在第一条语句上,当我将@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
答案 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