Sql 存储过程意外的结果

Sql 存储过程意外的结果,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我在这个存储过程中遇到了一个很大的编码问题。我让它工作到这样一种程度:它向表中的每个客户打印信件,但我需要它对状态敏感,以便在进入过程时只返回这些客户。我试图修改while子句,但在删除客户名称时出现了一些意想不到的结果 Create Proc spNewsLetter @StateID varchar(2) as DECLARE @CustCount INT DECLARE @CustomerName varchar(10) DECLARE @LastName varchar(20) D

我在这个存储过程中遇到了一个很大的编码问题。我让它工作到这样一种程度:它向表中的每个客户打印信件,但我需要它对状态敏感,以便在进入过程时只返回这些客户。我试图修改while子句,但在删除客户名称时出现了一些意想不到的结果

Create Proc spNewsLetter
@StateID varchar(2)
as



DECLARE @CustCount INT
DECLARE @CustomerName varchar(10)
DECLARE @LastName varchar(20)
DECLARE @FirstName varchar(15) 
DECLARE @SalesOfficer varchar(20)
DECLARE @Date as varchar(12) 
DECLARE @FutureDate as varChar(12)
DECLARE @JobDescription as varchar (20)

SET @CustomerName = '       '

Set @futureDate = DATEADD(dd, 14, getdate())

SET @Date = convert(char(12),getDate(), 107)

SELECT @SalesOfficer = FirstName + ' ' + LastName, @JobDescription = JobTitle
FROM Employee WHERE JobTitle = 'Chief Sales Officer'

SELECT @CustCount = count(*) FROM Customer  

SELECT @StateID = State
FROM Customer

IF EXISTS (Select @StateID from Customer)
BEGIN
WHILE @CustCount > 0  
BEGIN

 SELECT @CustomerName = MIN(CustomerID)
   FROM Customer WHERE CustomerID > @CustomerName
 SELECT @LastName = CustLastName,
   @FirstName=CustFirstName 
   FROM Customer WHERE  CustomerID = @CustomerName
 PRINT ' '
 PRINT ' '
 PRINT ' '
 PRINT ' '
 PRINT ' Date:' + @Date  
 PRINT ' '               
 PRINT ' Dear ' + @FirstName + ' ' + @LastName + ','
 PRINT ' '
 PRINT ' Eagle is please to offer you a 20% discount on any purchase you make prior   to 11:55pm '+@FutureDate+'.'                 
 PRINT ' This limited time offer is our best offer of the year!  You can view our entire product line '
 PRINT ' and place your order at Eagle20Deal.com.  Make sure to place your order by ' +@FutureDate
 PRINT ' because this offer expires at 11:55pm on that day.'
 PRINT ' '
 PRINT ' Sincerely, ' + @SalesOfficer 
 PRINT '            '+@JobDescription           
 PRINT '            Eagle Corporation' 
 PRINT '*****************************************' 

 SET @CustCount = @CustCount - 1 

END  -- *** end of while block
END -- *** end of if
ELSE 
BEGIN
 Print 'Please enter a valid state ID'
END  -- *** end of else block

非常感谢您的帮助

我想我们的问题是您的评论在节目后期确实有所帮助。谢谢您,这是成品

Create Proc spNewsLetter
@StateID varchar(2)
as

DECLARE @CustCount varchar (20)
DECLARE @CustomerName varchar(10)
DECLARE @LastName varchar(20)
DECLARE @FirstName varchar(15) 
DECLARE @SalesOfficer varchar(20)
DECLARE @Date as varchar(12) 
DECLARE @FutureDate as varChar(12)
DECLARE @JobDescription as varchar (20)
DECLARE @CompanyName Varchar(20)


SET @CustomerName = '       '

Set @futureDate = DATEADD(dd, 14, getdate())


SET @Date = convert(char(12),getDate(), 107)

SELECT @SalesOfficer = FirstName + ' ' + LastName, @JobDescription = JobTitle
FROM Employee WHERE JobTitle = 'Chief Sales Officer'

SELECT @CustCount = Count(CustomerID) FROM Customer  
WHERE @StateID = State


if @CustCount > 0   
BEGIN
 WHILE @CustCount > 0   
   BEGIN

     SELECT @CustomerName = MIN(CustomerID)
       FROM Customer WHERE CustomerID > @CustomerName and @StateID = State
     SELECT @LastName = CustLastName,
       @FirstName=CustFirstName, @CompanyName = Coalesce(CompanyName,'')
       FROM Customer WHERE  CustomerID = @CustomerName and @StateID = State
     PRINT ' '
     PRINT ' '
     PRINT ' '
     PRINT ' '
     PRINT ' Date:' + @Date  
     PRINT ' '               
     PRINT ' Dear ' + @FirstName + ' ' + @LastName + ', '+@CompanyName 
     PRINT ' '
     PRINT ' Eagle is please to offer you a 20% discount on any purchase you make prior to 11:55pm '+@FutureDate+'.'
     PRINT ' This limited time offer is our best offer of the year!  You can view our entire product line '
     PRINT ' and place your order at Eagle20Deal.com.  Make sure to place your order by ' +@FutureDate
     PRINT ' because this offer expires at 11:55pm on that day.'
     PRINT ' '
     PRINT ' Sincerely, ' + @SalesOfficer 
     PRINT '            '+@JobDescription           
     PRINT '            Eagle Corporation' 
     PRINT '*****************************************' 

     SET @CustCount = @CustCount - 1 


   END
END
ELSE 
BEGIN
     Print 'Please enter a valid state ID'
END 

如果@StateID被传递到过程中,那么为什么要在其中选择一个值?您能详细说明一下吗?我不明白你的意思。你的意思是要我删除涉及@StateID的select语句吗?我们的过程接受StateID的值。然后从Customer中选择@StateID=State。然后将StateID变量中的值替换为Customer中的值。旁注:我打赌您在这一行上会出错,因为我打赌客户有多行。实际上,我现在没有收到任何错误。我不需要将@StateID与客户表中的值关联起来吗?很高兴你得到了它。只是一些评论。你不需要在循环中使用IF。如果@CustCount为0,则循环将不会启动。你也应该研究一下游标(我真不敢相信我刚才这么说了)。大部分工作应该在应用程序/报表级别完成,而不是在数据库中完成。但是如果你必须在这里做的话,也许这是一个放置光标的好地方。它允许您一次检索所有行,然后循环遍历它们。