0

我有一个存储过程,它使用一个名为@Command (nvarchar(MAX)). 然后我根据给定的输入相应地添加参数。

declare @Command nvarchar(max)
if(@CaseFileID IS NOT NULL)
BEGIN
select @Command='
  select [ServerCredentialsID],[CaseFileID],EIKSLT.[LocationType],EPT.PaymentType,[TaskID],[DateActive]
      ,[LengthOfPurchase],[Username],[Password],[IPDomain],[Port],[DES],[Website],[AmountPaid],[Latitude]
      ,[Longitude],[HasAttachments],[TimeStamp],[CaseElement],[Temporary],[StatusID] 
      FROM Element17a_IKSServerCredentials EIKSSC 
      JOIN ElementsIKSLocationTypes EIKSLT ON EIKSSC.LocationBeingUsedID= EIKSLT.IKSLocationBeingUsedID 
      JOIN ElementsPaymentTypes EPT ON EIKSSC.PaymentMethodID=EPT.PaymentTypeID 
      where  EIKSSC.CaseFileID='''+cast(@CaseFileID as nvarchar(MAX))+''' '

@CaseFileID 被声明为一个 int,在表中它是一个 int。当我尝试

where  EIKSSC.CaseFileID = ' + @CaseFileID + ' '

然后该值甚至不显示(在错误中看起来像"EIKSSC.CaseFileID= '"

我只是不明白。

注意:SQL Server 2008 管理工作室

4

1 回答 1

1

这是因为 @CaseFileID 是 VARCHAR 即使您没有显示它。
IF应该是

if(@CaseFileID > '')

如果即使这样也不起作用,那么您需要交换到 LEFT 联接,因为 INNER JOIN 将删除其他 2 个表中无法匹配的记录。

最后,因为 CaseFileID 是一个 int,所以不需要引号。尽管 SQL Server 会在WHERE子句中将“9”隐式转换为整数 9,但这并不是必需的。

declare @Command nvarchar(max)
if(@CaseFileID > '')
BEGIN
select @Command='
  select [ServerCredentialsID],[CaseFileID],EIKSLT.[LocationType],EPT.PaymentType,[TaskID],[DateActive]
      ,[LengthOfPurchase],[Username],[Password],[IPDomain],[Port],[DES],[Website],[AmountPaid],[Latitude]
      ,[Longitude],[HasAttachments],[TimeStamp],[CaseElement],[Temporary],[StatusID] 
      FROM Element17a_IKSServerCredentials EIKSSC 
      LEFT JOIN ElementsIKSLocationTypes EIKSLT ON EIKSSC.LocationBeingUsedID= EIKSLT.IKSLocationBeingUsedID 
      LEFT JOIN ElementsPaymentTypes EPT ON EIKSSC.PaymentMethodID=EPT.PaymentTypeID 
      where  EIKSSC.CaseFileID='+cast(@CaseFileID as nvarchar(MAX))
于 2012-12-14T21:16:51.933 回答