2010-01-20 35 views
1

我有一个问题/问题,我可能一直盯着今天太长。传递SQL时​​带单引号的环绕变量Smalldatetime

我有一个从Web应用程序接收数据的存储过程。数据以小日期时间格式显示。我试图将这些信息传递给第二个存储过程,但第二个不会触发,除非数据在单引号中。将这个视为varchar会更好吗?

的SET @CompletedDate必须是“2010-01-20 15:28:00" 原因很明显。我如何将此信息传递给第二个过程?

DECLARE @return_value int 
    ,@TaskID int 
    ,@CompletedDate smalldatetime 
SET @TaskID = 90 
SET @CompletedDate = 2010-01-20 15:28:00 

EXEC @return_value = [dbo].[usp_Task_Completion] 
     @TaskID = @TaskID, 
     @CompletedDate = @CompletedDate 

这里是usp_Task_Completion SP

SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[usp_Task_Completion] 
@TaskID int 
,@CompletedDate smalldatetime 
AS 
BEGIN 

SET NOCOUNT ON; 

--Mark Transaction as complete 
UPDATE dbo.Task 
SET Completed = 1 
    ,CompletedDate = @CompletedDate 
WHERE TaskID = @TaskID 
+0

usp_Task_Completion如何定义@CompletedDate参数? – 2010-01-20 21:58:00

+0

@CompletedDate smalldatetime – jgardner04 2010-01-20 21:59:28

+1

是否存在taskID 90? – SQLMenace 2010-01-20 22:15:26

回答

2

没有因为一个varchar也必须在单引号括起来,只是把它的报价

DECLARE @return_value int 
    ,@TaskID int 
    ,@CompletedDate smalldatetime 
SET @TaskID = 90 
SET @CompletedDate = '2010-01-20 15:28:00' 

EXEC @return_value = [dbo].[usp_Task_Completion] 
     @TaskID = @TaskID, 
     @CompletedDate = @CompletedDate 
+0

这就是我也在想,我只是无法让它通过smalldatetime。 – jgardner04 2010-01-20 22:01:02

+0

错误是什么? – SQLMenace 2010-01-20 22:02:29

+0

这就是我遇到问题的地方。它不会错误我只是不会运行usp_Task_Completion_SP这是一个简单的UPDATE SET命令 – jgardner04 2010-01-20 22:03:56

0
各地

是的,你必须把那个小日期时间2010-01-20 15:28:00放入单引号 - >'2010-01-20 15:28:00'

+0

我知道我想知道如何将变量用'''+ @CompletedDate +'''' – jgardner04 2010-01-20 22:02:32

0

你可能在@CompletedDate 。在申报更改变量名,然后改变你的set命令使用单引号,像这样:

SET @CompletedDateNewName = '2010-01-20 15:28:00' 

@CompletedDate仍然是一个SMALLDATETIME型

+0

这样的单引号括起来,这不是问题。看到这里 创建PROC prTest @id INT为 选择@id的ID 去 声明@Id诠释 设置@id = 5 EXEC prTest @id = @id 去 – SQLMenace 2010-01-20 22:04:29

+0

是的,我已经证实,命名公约不是问题。 – jgardner04 2010-01-20 22:10:31

+0

行 - 这是很方便的知道 – Ray 2010-01-20 23:24:51

0

这是一个评论有点多。有什么问题?下面是我的测试:

/* 
create proc usp_Task_Completion (
    @TaskID int, 
    @CompletedDate smalldatetime) 
as 

    return 1000 
*/ 
go 


DECLARE @return_value int 
    ,@TaskID int 
    ,@CompletedDate smalldatetime 
SET @TaskID = 90 

/* This works */ 
--SET @CompletedDate = '2010-01-20 15:28:00'  

/* This doesn't work (incorrect syntax near '15'. */ 
--SET @CompletedDate = 2010-01-20 15:28:00  

/* This runs but yields unintended results (2010-01-20 = 1989; convert to datetime = '1905-06-13' */ 
SET @CompletedDate = 2010-01-20 

EXEC @return_value = [dbo].[usp_Task_Completion] 
     @TaskID = @TaskID, 
     @CompletedDate = @CompletedDate 

select @return_value 
+0

的作品做一个不是因为你得到的整数运算 来看,这种 声明@CompletedDate SMALLDATETIME SET @CompletedDate = 2010-01-20 选择@CompletedDate - 输出1905-06-13 00:00:00 – SQLMenace 2010-01-20 22:10:34

+0

@SQLMenace - true。我会修改。 – 2010-01-20 22:11:33

0

我猜CompletedDate列不是SMALLDATETIME,它正试图在该列中投的每一个值到SMALLDATETIME型(有一些失败)。请检查列类型是否真的确定。

+0

不,我们很好。它看起来像我一直在绞尽脑汁,并且是应用程序未传递@TaskID变量的错误。 – jgardner04 2010-01-20 22:24:13

+1

顺便说一句 - 只是因为web应用程序给你一个smalldatetime类型,并不意味着数据库需要这样做。如果该列实际上是日期时间,或者甚至可能是char(19),那么在比较它之前,应该先转换变量。 – 2010-01-20 22:24:35

+0

你是正确的,应用程序和数据库需要同步,但它看起来像这个问题是@TaskID变量不是由应用程序设置。 – jgardner04 2010-01-20 22:28:04