Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 以视图名称和日期为参数的动态存储过程_Sql_Sql Server_Sql Server 2014 - Fatal编程技术网

Sql 以视图名称和日期为参数的动态存储过程

Sql 以视图名称和日期为参数的动态存储过程,sql,sql-server,sql-server-2014,Sql,Sql Server,Sql Server 2014,我创建了一个存储过程,它将视图名称和日期作为参数,并检查视图中是否有该日期的记录。但是,我得到了以下错误 '操作数类型冲突:日期与int不兼容' 我希望,如果该记录存在,将返回1,否则将返回0,我可以在另一个存储过程中使用该记录来做出决定 代码如下所示 CREATE PROCEDURE [dbo].[usr_RecordExist] -- Add the parameters for the stored procedure here @ViewName SYSNAME,

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

'操作数类型冲突:日期与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
表达式+不起任何作用,请使用+添加单个引号

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

既然您对ViewName使用了QUOTENAME,为什么不呢QUOTENAME@DATEVARCHAR或QUOTENAME@DATEVARCHAR,CHAR39

科斯敏明白了。尽管我也注意到您将@DATEVARCHAR设置为NVARCHAR4000,即使convertNVARCHAR不带长度默认值为30。

您使用的工具是正确的,但使用的方式是错误的,您不应该连接参数,而应该将其作为参数传递给系统存储过程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

谢谢,我如何才能让它返回记录计数?此查询将返回计数,是否要在输出参数中返回计数?