jholmes0724
asked on
SQL Server 2000 Cursor Issue with Variable Values adding concatenated text
Scenario:
I have a stored procedure that I need to loop through records in a log table and send out email messages to users. I am using a CURSOR to loop through each record in the table and getting 2 field values that I am trying to concatenate a variable declare within the stored procedure.
I am using a SET statement Like this SET @Body = @Body + 'Table Name: ' + @TableName See full code below.
The problem is when I use this method in the CURSOR the final results come out blank. I am using the PRINT function to view the results. If I just use SET @Body = 'Table Name:' + @TableName and PRINT out each line, it works fine. Don't Understand why using the @Body = @Body + "Additional Text' does not work, I use this type on Concatenation all the time, not sure why it does not work within the cursor. Here is my code:
ALTER PROCEDURE [dbo].[spEmailControlTable Change]
-- Add the parameters for the stored procedure here
AS
DECLARE @Comments varchar(500)
DECLARe @TableName varchar(75)
DECLARE @emailFrom varchar(75)
DECLARE @EmailTo varchar(500)
DECLARE @Subject varchar(255)
DECLARE @Body varchar(8000)
DECLARE @BodyLine varchar(8000)
DECLARE @RecCount int
DECLARE @TotalCount int
/********** Get Total Count of all Records that Have Been Updated*/
SET @TotalCount = (Select Count(recID) as RecCount from dbo.LVRG_CTRL_ControlTable ChangeLog WHERE UpdateFlag = 1)
SET @RecCount = 1
SET @emailFrom = 'ABMTools@Hp.com'
SET @emailTo = 'jesse.holmes@hp.com'
--SET @emailTo = 'jesse.holmes@hp.com, Pramod.bohra@hp.com, Rachael.Mclarty@hp.com, Angel.Garza@hp.com'
SET @subject = 'SLA Control Table Change Notification - Change occured on the Folowing Table(s): '
SET @Body = 'The Following Tables Have been Changed' + CHAR(13)
SET @Body = @Body + '========================= ========== ========== ======='
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @TableCursor CURSOR
SET @TableCursor = CURSOR -- FAST_FORWARD
FOR
Select TableName, Comments
From dbo.LVRG_CTRL_ControlTable ChangeLog
WHERE UpdateFlag = 1
OPEN @TableCursor
FETCH NEXT FROM @TableCursor
INTO @TableName,@Comments
WHILE @@FETCH_STATUS = 0
BEGIN
--******* Add a new Line to Body Text *************
SET @Body = @Body + 'Table Name: ' + @TableName + ' - Change Desc: ' + @Comments + CHAR(13)
PRINT @RecCount
PRINT @Body
--******* Increment Record Count **********
SET @RecCount = @RecCount + 1
IF @RecCount > @TotalCount
BEGIN
PRINT 'Final Body: = ' + @Body
PRINT 'DONE'
END
I have a stored procedure that I need to loop through records in a log table and send out email messages to users. I am using a CURSOR to loop through each record in the table and getting 2 field values that I am trying to concatenate a variable declare within the stored procedure.
I am using a SET statement Like this SET @Body = @Body + 'Table Name: ' + @TableName See full code below.
The problem is when I use this method in the CURSOR the final results come out blank. I am using the PRINT function to view the results. If I just use SET @Body = 'Table Name:' + @TableName and PRINT out each line, it works fine. Don't Understand why using the @Body = @Body + "Additional Text' does not work, I use this type on Concatenation all the time, not sure why it does not work within the cursor. Here is my code:
ALTER PROCEDURE [dbo].[spEmailControlTable
-- Add the parameters for the stored procedure here
AS
DECLARE @Comments varchar(500)
DECLARe @TableName varchar(75)
DECLARE @emailFrom varchar(75)
DECLARE @EmailTo varchar(500)
DECLARE @Subject varchar(255)
DECLARE @Body varchar(8000)
DECLARE @BodyLine varchar(8000)
DECLARE @RecCount int
DECLARE @TotalCount int
/********** Get Total Count of all Records that Have Been Updated*/
SET @TotalCount = (Select Count(recID) as RecCount from dbo.LVRG_CTRL_ControlTable
SET @RecCount = 1
SET @emailFrom = 'ABMTools@Hp.com'
SET @emailTo = 'jesse.holmes@hp.com'
--SET @emailTo = 'jesse.holmes@hp.com, Pramod.bohra@hp.com, Rachael.Mclarty@hp.com, Angel.Garza@hp.com'
SET @subject = 'SLA Control Table Change Notification - Change occured on the Folowing Table(s): '
SET @Body = 'The Following Tables Have been Changed' + CHAR(13)
SET @Body = @Body + '=========================
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @TableCursor CURSOR
SET @TableCursor = CURSOR -- FAST_FORWARD
FOR
Select TableName, Comments
From dbo.LVRG_CTRL_ControlTable
WHERE UpdateFlag = 1
OPEN @TableCursor
FETCH NEXT FROM @TableCursor
INTO @TableName,@Comments
WHILE @@FETCH_STATUS = 0
BEGIN
--******* Add a new Line to Body Text *************
SET @Body = @Body + 'Table Name: ' + @TableName + ' - Change Desc: ' + @Comments + CHAR(13)
PRINT @RecCount
PRINT @Body
--******* Increment Record Count **********
SET @RecCount = @RecCount + 1
IF @RecCount > @TotalCount
BEGIN
PRINT 'Final Body: = ' + @Body
PRINT 'DONE'
END
when the result is blank, any of your values should be null. kindly check the values
ASKER
I have, I did have some that where null and I fixed that but I still got the same issue.
if you get a blank value on a set stament, then it should be a null value in the string value.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Not sure what you are getting at, The variable @Body Gets a string value right in the beginning of the SP. The Final Output of the @Body variable would never be null. I am trying to add another line to the string Variable @Body on every iteration of the cursor loop. I DO NOT Get a blank value if I simply set the variable like this @Body = @TableName. It will store the value of @TableName in the @Body Variable but as soon as I try to add to the @Body Varialbe using SET @Body = @Boday + 'Additionl values' it does not work. That is what I am trying to get answered. Please explain why you keep asking me about the null values, there are no null values.
weird, there must be some NULL values in comments or tableName. Concatenating string and NULL = NULL
ASKER
Thank you very much. Sorry I didn't understand why the null was an issue but using this code makes it work. I still don't fully understand why. But that's why your the expert. Thanks again.
It depend's on database setting CONCAT_NULL_YIELDS_NULL (right click on database in MS -> Properties -> options -> Concatenate.... )
or you can write in your script:
SET CONCAT_NULL_YIELDS_NULL ON
SET CONCAT_NULL_YIELDS_NULL OFF
another solution could be SET CONCAT_NULL_YIELDS_NULL OFF in the beginning of the script and then you can use the SET command without ISNULL
ASKER
1
Table Name: AARP_DATA_D1_BillMatrix - Change Desc: TeST
2
Table Name: AARP_DATA_D1_BillMatrix - Change Desc: Record Updated where Company = AARP and Region = CRBLA and Model Name = 3810S and TranslateModel = TestModel
3
Table Name: AARP_DATA_D1_BillMatrix - Change Desc: Record Updated where Company = AARP and Region = CRBLA and Model Name = 3810S
4
Table Name: LVRG_CTRL_DelivLookupTable
5
Table Name: LVRG_CTRL_DelivLookupTable
6
Table Name: LVRG_CTRL_DelivLookupTable
7
Table Name: LVRG_CTRL_DelivLookupTable
8
Table Name: LVRG_CTRL_DelivLookupTable
9
Table Name: LVRG_CTRL_SiteLookupTable - Change Desc: Record Updated for Company AARP and Location_Code value: RFD
Final Body: = Table Name: LVRG_CTRL_SiteLookupTable - Change Desc: Record Updated for Company AARP and Location_Code value: RFD
DONE