Sql server 无法将输入参数传递给存储过程

Sql server 无法将输入参数传递给存储过程,sql-server,sql-server-2008,sql-server-2012,Sql Server,Sql Server 2008,Sql Server 2012,我有这样的存储过程,根据搜索条件从数据库中获取值,我将这些值作为输入参数传递给该过程,但在@StatusSelection CREATE PROCEDURE [dbo].[tp_SelectTransactionHistorySearch] ( @OffSetRowNo INT, @FetchRowNo INT, @StatusSelection NVARCHAR(MAX), @isReviewed Bit, @ProjectCaseNumber VARC

我有这样的存储过程,根据搜索条件从数据库中获取值,我将这些值作为输入参数传递给该过程,但在
@StatusSelection

CREATE PROCEDURE [dbo].[tp_SelectTransactionHistorySearch]
(
   @OffSetRowNo INT,     
   @FetchRowNo INT,
   @StatusSelection NVARCHAR(MAX),
   @isReviewed Bit,
   @ProjectCaseNumber VARCHAR(MAX),
   @CostPageNumber VARCHAR(MAX),
   @TransactionTypeChange VARCHAR(MAX),
   @DescriptionChange VARCHAR(MAX),
   @TrasactionCreateOnBeginDate DATETIME,
   @TransactionCreatedOnEndDate DATETIME,
   @TransactionUpdatedOnBeginDate DATETIME,
   @TransactionUpdateOnEndDate DATETIME,
   @ItemID VARCHAR(MAX)
)
AS
 Select 
            TH.TransactionID,
            TH.IsReviewed,
            TH.ItemID,
            TH.CostPageNumber,
            TH.Comments,
            TH.CreatedBy,
            TH.CreatedDateTime,
            TH.UpdatedBy,
            TH.UpdatedDateTime,
            TH.TransactionDescription,
            TH.TransactionTypeID,
            IAccrualByItem.PROJCASE,
            IAccrualByItem.USTSTAT as TransactionStatusID,
            TStatType.Name AS TransactionStatusTypeName,
            TStatType.Description AS TransactionStatusTypeDescription,   
            TType.Name AS TransactionTypeName,
            TType.Description AS TransactionTypeDescription,
            COUNT(*) OVER () as TotalCount
        FROM TransactionHistory AS TH
        INNER JOIN TRVMVSDDVW001.INTERFACE_Files.dbo.DBATUSTA AS IAccrualByItem
            ON TH.TransactionID = CAST(IAccrualByItem.USTTRNNBR AS int)
        LEFT JOIN dbo.TransctionStatusType AS TStatType
            ON TStatType.TransactionStatusTypeID = IAccrualByItem.USTSTAT
        LEFT JOIN dbo.TransactionType AS TType
            ON TType.TransactionTypeID = CAST(TH.TransactionTypeID AS int)
        WHERE TStatType.Name = @StatusSelection AND TH.IsReviewed= @isReviewed
        AND IAccrualByItem.PROJCASE=@ProjectCaseNumber AND TH.CostPageNumber=@CostPageNumber
        AND TH.TransactionDescription=@TransactionTypeChange AND TType.Description=@DescriptionChange
        AND  (TH.CreatedDateTime >= CAST(@TrasactionCreateOnBeginDate AS DATE)) AND (TH.CreatedDateTime < CAST(@TransactionCreatedOnEndDate AS DATE))
         AND  (TH.UpdatedDateTime >= CAST( @TransactionUpdatedOnBeginDate AS DATE)) AND (TH.UpdatedDateTime < CAST(@TransactionUpdateOnEndDate AS DATE))
         @TH.StatusID= 1
GROUP BY TH.TransactionID,TH.IsReviewed,TH.ItemID,TH.CostPageNumber,TH.Comments,TH.CreatedBy,TH.CreatedDateTime,
TH.UpdatedBy,TH.UpdatedDateTime, TH.TransactionDescription, TH.TransactionTypeID,IAccrualByItem.PROJCASE,TransactionStatusID,
TStatType.Name,TStatType.Description,TType.Name,TType.Description
ORDER BY TH.TransactionID,TH.ItemID,TH.CostPageNumber
OFFSET ( @OffSetRowNo-1 ) * @FetchRowNo ROWS
FETCH NEXT @FetchRowNo ROWS ONLY
我使用的是sql server 2012版本

请任何人对此解决方案和想法提供帮助。。 非常感谢

更新:

    DECLARE @return_value int

EXEC    @return_value = [dbo].[tp_SelectTransactionHistorySearch]
        @OffSetRowNo = 1,
        @FetchRowNo = 1,
        @StatusSelection = N's',
        @isReviewed = NULL,
        @ProjectCaseNumber = NULL,
        @CostPageNumber = NULL,
        @TransactionTypeChange = NULL,
        @DescriptionChange = NULL,
        @TrasactionCreateOnBeginDate = '10-03-2013',
        @TransactionCreatedOnEndDate = '20-03-2013',
        @TransactionUpdatedOnBeginDate = '20-05-2013',
        @TransactionUpdateOnEndDate = '04-06-2013',
        @ItemID = NULL

   SELECT   'Return Value' = @return_value

GO
DECLARE @temp TABLE
(
    string VARCHAR(10)
)

SET DATEFORMAT dmy 

INSERT INTO @temp (string)
VALUES 
    ('10-03-2013'),
    ('20-03-2013'),
    ('20-05-2013'),
    ('04-06-2013')

SELECT CAST(string AS DATE) 
FROM @temp
获取如下错误
Msg 8114,级别16,状态5,过程tp\u SelectTransactionHistorySearch,第0行

将数据类型varchar转换为datetime时出错

是否在代码隐藏端传递了值

     SqlCommand com = new SqlCommand("SpName",conectionStringObj);
    com.CommandType = CommandType.StoredProcedure;
     **com.Parameters.AddWithValue("@StatusSelection", "Any Value");**
       .
       .
       .
       .
请检查这个。

试试这个-

CREATE PROCEDURE [dbo].[tp_SelectTransactionHistorySearch] 
(
    @OffSetRowNo INT,
    @FetchRowNo INT,
    @StatusSelection NVARCHAR(MAX),
    @isReviewed BIT,
    @ProjectCaseNumber VARCHAR(MAX),
    @CostPageNumber VARCHAR(MAX),
    @TransactionTypeChange VARCHAR(MAX),
    @DescriptionChange VARCHAR(MAX),
    @TrasactionCreateOnBeginDate DATE,
    @TransactionCreatedOnEndDate DATE,
    @TransactionUpdatedOnBeginDate DATE,
    @TransactionUpdateOnEndDate DATE,
    @ItemID VARCHAR(MAX)
)
AS
    SELECT TH.TransactionID
        ,  TH.IsReviewed
        ,  TH.ItemID
        ,  TH.CostPageNumber
        ,  TH.Comments
        ,  TH.CreatedBy
        ,  TH.CreatedDateTime
        ,  TH.UpdatedBy
        ,  TH.UpdatedDateTime
        ,  TH.TransactionDescription
        ,  TH.TransactionTypeID
        ,  IAccrualByItem.PROJCASE
        ,  IAccrualByItem.USTSTAT AS TransactionStatusID
        ,  TStatType.Name AS TransactionStatusTypeName
        ,  TStatType.[description] AS TransactionStatusTypeDescription
        ,  TType.Name AS TransactionTypeName
        ,  TType.[description] AS TransactionTypeDescription
        ,  COUNT(*) OVER () AS TotalCount
    FROM TransactionHistory AS TH
    JOIN TRVMVSDDVW001.INTERFACE_Files.dbo.DBATUSTA AS IAccrualByItem ON TH.TransactionID = CAST(IAccrualByItem.USTTRNNBR AS INT)
    LEFT JOIN dbo.TransctionStatusType AS TStatType ON TStatType.TransactionStatusTypeID= IAccrualByItem.USTSTAT
    LEFT JOIN dbo.TransactionType AS TType ON TType.TransactionTypeID = CAST(TH.TransactionTypeID AS INT)
    WHERE TStatType.Name = @StatusSelection
        AND TH.IsReviewed = @isReviewed
        AND IAccrualByItem.PROJCASE = @ProjectCaseNumber
        AND TH.CostPageNumber = @CostPageNumber
        AND TH.TransactionDescription = @TransactionTypeChange
        AND TType.[description] = @DescriptionChange
        AND TH.CreatedDateTime BETWEEN @TrasactionCreateOnBeginDate AND @TransactionCreatedOnEndDate
        AND TH.UpdatedDateTime BETWEEN @TransactionUpdatedOnBeginDate AND @TransactionUpdateOnEndDate
        AND TH.StatusID = 1
    GROUP BY
          TH.TransactionID
        , TH.IsReviewed
        , TH.ItemID
        , TH.CostPageNumber
        , TH.Comments
        , TH.CreatedBy
        , TH.CreatedDateTime
        , TH.UpdatedBy
        , TH.UpdatedDateTime
        , TH.TransactionDescription
        , TH.TransactionTypeID
        , IAccrualByItem.PROJCASE
        , TransactionStatusID
        , TStatType.Name
        , TStatType.[description]
        , TType.Name
        , TType.[description]
    ORDER BY 
          TH.TransactionID
        , TH.ItemID
        , TH.CostPageNumber
    OFFSET (@OffSetRowNo - 1) * @FetchRowNo ROWS FETCH NEXT @FetchRowNo ROWS ONLY
更新#1:

    DECLARE @return_value int

EXEC    @return_value = [dbo].[tp_SelectTransactionHistorySearch]
        @OffSetRowNo = 1,
        @FetchRowNo = 1,
        @StatusSelection = N's',
        @isReviewed = NULL,
        @ProjectCaseNumber = NULL,
        @CostPageNumber = NULL,
        @TransactionTypeChange = NULL,
        @DescriptionChange = NULL,
        @TrasactionCreateOnBeginDate = '10-03-2013',
        @TransactionCreatedOnEndDate = '20-03-2013',
        @TransactionUpdatedOnBeginDate = '20-05-2013',
        @TransactionUpdateOnEndDate = '04-06-2013',
        @ItemID = NULL

   SELECT   'Return Value' = @return_value

GO
DECLARE @temp TABLE
(
    string VARCHAR(10)
)

SET DATEFORMAT dmy 

INSERT INTO @temp (string)
VALUES 
    ('10-03-2013'),
    ('20-03-2013'),
    ('20-05-2013'),
    ('04-06-2013')

SELECT CAST(string AS DATE) 
FROM @temp
在执行查询之前设置此选项-

SET DATEFORMAT dmy
或者,更可取的是,使用
ISO
格式
yyyymmdd
-

EXEC @return_value = [dbo].[tp_SelectTransactionHistorySearch]
    ...
    @TrasactionCreateOnBeginDate = '20130310',
    @TransactionCreatedOnEndDate = '20132003',
    @TransactionUpdatedOnBeginDate = '20130520',
    @TransactionUpdateOnEndDate = '20130604',
    @ItemID = NULL
更新#2:

    DECLARE @return_value int

EXEC    @return_value = [dbo].[tp_SelectTransactionHistorySearch]
        @OffSetRowNo = 1,
        @FetchRowNo = 1,
        @StatusSelection = N's',
        @isReviewed = NULL,
        @ProjectCaseNumber = NULL,
        @CostPageNumber = NULL,
        @TransactionTypeChange = NULL,
        @DescriptionChange = NULL,
        @TrasactionCreateOnBeginDate = '10-03-2013',
        @TransactionCreatedOnEndDate = '20-03-2013',
        @TransactionUpdatedOnBeginDate = '20-05-2013',
        @TransactionUpdateOnEndDate = '04-06-2013',
        @ItemID = NULL

   SELECT   'Return Value' = @return_value

GO
DECLARE @temp TABLE
(
    string VARCHAR(10)
)

SET DATEFORMAT dmy 

INSERT INTO @temp (string)
VALUES 
    ('10-03-2013'),
    ('20-03-2013'),
    ('20-05-2013'),
    ('04-06-2013')

SELECT CAST(string AS DATE) 
FROM @temp
线路

@TH.StatusID= 1
表示创建失败

所以你不能得到你给我们的代码显示的错误

有了这个,就可以创作作品了

 AND TH.StatusID= 1

请尝试@StatusSelection NVARCHAR(MAX)=nullTStatType.Name=@StatusSelection…在这一行中,您可以将其更改为TStatType.Name=isnull(@StatusSelection',),或者可以是TStatType.Name=isnull(@StatusSelection,null)??@pratapk:-一定要让我知道您在这次更改后得到了什么???@Rahultripati我已经更改了那个我在日期转换方面遇到了问题…我得到了像09-09-2013、08-07-2013这样的数据库值。。。我得到的输入值与更新中提到的类似,但我得到的转换错误…我真的很抱歉,但我无法非常清楚地理解您的观点…但我得到的是,您无法将varchar值强制转换为DATETIME字段。为此,我已经在以下问题中回答了您:-如果您误解了我在sql server it内部执行此存储过程,请原谅。我认为您需要提及您是如何使此过程正常工作的。具体来说,这是如何删除关于
@StatusSelection
的错误消息的。该错误消息不会修复OP的错误。诚然,发布的代码并不是导致错误的原因,但如果您提到Q中发布的错误与代码无关,您不认为这会有所帮助吗?。您不需要在
count(*)over()中输入order by()
,这样就可以了。@Mikael Eriksson谢谢您的评论。我在()上回滚
COUNT(*)中的更改。我认为
@TH.StatusID=1
中的主要语法错误。只需将其更改为
和TH.StatusID=1
对不起,我从
@TH.StatusID=1
中删除了
@
符号,现在我收到另一个错误
消息8114,级别16,状态5,程序tp\u SelectionTransactionHistorySearch,第0行错误将数据类型nvarchar转换为日期时间
。我如何解决这个问题…请帮忙,谢谢solution@pratapk:显示如何使用代码调用此过程。您的错误是由于缺少参数造成的。那么您是否正确使用了SQLParameter?还是使用字符串连接?