动态存储过程,视图名称和日期作为参数

时间:2015-10-23 21:55:48

标签: sql sql-server sql-server-2014

我创建了一个存储过程,它将视图名称和日期作为参数,并检查视图中是否有该日期的记录。但是,我收到以下错误

  

'操作数类型冲突:日期与int'。

不兼容

我希望如果记录存在,1将被返回,否则将返回0,我可以使用它在另一个存储过程中做出决定。

代码列在下面

CREATE PROCEDURE [dbo].[usr_RecordExist]
    -- Add the parameters for the stored procedure here
    @ViewName SYSNAME,
    @TransDate Date
    --<@Param2, sysname, @p2> <Datatype_For_Param2, , int> = <Default_Value_For_Param2, , 0>
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    DECLARE @DATEVARCHAR nvarchar(4000);
    SET @DATEVARCHAR = CONVERT(NVARCHAR, @TransDate, 103);
    -- Insert statements for procedure here
   DECLARE @SQLCommand NVARCHAR(MAX) = 
        N'SELECT COUNT(SYMBOL) FROM ' + QUOTENAME(@ViewName) + 'WHERE TRANSDATE = ' + '' + @DATEVARCHAR + '';

   EXECUTE [dbo].[sp_executesql] 
             @sqlCommand;
END

4 个答案:

答案 0 :(得分:2)

表达式 +''不执行任何操作,请使用 +''''添加单引号。

...  + '''' + @DATEVARCHAR + '''';

答案 1 :(得分:1)

您正在使用正确的工具,但方法错误,您不应该连接参数,而是将它们作为参数传递给系统存储过程sp_executesql,如下所示:

CREATE PROCEDURE [dbo].[usr_RecordExist]
    @ViewName SYSNAME,
    @TransDate Date
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @SQLCommand NVARCHAR(MAX);
 SET @SQLCommand = N'SELECT COUNT(SYMBOL) FROM ' + QUOTENAME(@ViewName) 
                 + N' WHERE TRANSDATE = @TransDate';

   EXECUTE [dbo].[sp_executesql] @sqlCommand
                                ,N'@TransDate Date'
                                ,@TransDate
END

修改

要获取输出参数中的计数,您将执行以下操作:

CREATE PROCEDURE [dbo].[usr_RecordExist]
    @ViewName SYSNAME,
    @TransDate Date,
    @Count INT OUTPUT
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @SQLCommand NVARCHAR(MAX);
 SET @SQLCommand = N'SELECT @Count = COUNT(SYMBOL) FROM ' + QUOTENAME(@ViewName) 
                 + N' WHERE TRANSDATE = @TransDate';

   EXECUTE [dbo].[sp_executesql] @sqlCommand
                                ,N'@TransDate Date, @Count INT OUTPUT'
                                ,@TransDate
                                ,@Count OUTPUT
END

答案 2 :(得分:0)

由于您QUOTENAME()使用了ViewName,为什么不QUOTENAME(@DATEVARCHAR, '''')QUOTENAME(@DATEVARCHAR, CHAR(39))

答案 3 :(得分:0)

科斯明得到了它。虽然我也注意到你将@DATEVARCHAR设置为NVARCHAR(4000),即使转换(没有长度的NVARCHAR默认为30。