【问题标题】:SQL 2012 - SearchAllTables for datetime Stored procedureSQL 2012 - 日期时间存储过程的 SearchAllTables
【发布时间】:2012-09-10 19:03:30
【问题描述】:

我正在尝试创建一个存储过程,它将在数据库的所有用户创建的表中搜索搜索字符串。

我找到了我想开始并以此为基础的存储过程。

http://vyaskn.tripod.com/search_all_columns_in_all_tables.htm

唯一的问题是在搜索中输入日期时间将始终不返回任何内容。

如何修改它来搜索日期?

兴趣线:

CREATE PROC SearchAllTables
@SearchStr nvarchar(100)
AS
     ....
    SET @SearchStr2 = CASE WHEN ISDATE(@SearchStr)=0
                  THEN QUOTENAME('%' + @SearchStr + '%','''')
                  ELSE @SearchStr END
     ....


    --Here's where the comparison is made. This comparison works for string and numeric types but not      datetime
     DECLARE @sql nvarchar(max)

            IF ISDATE(@SearchStr) = 0       
            BEGIN
                SET @sql = 'INSERT INTO #Results SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630) 
                    FROM ' + @TableName + ' (NOLOCK) ' +
                    ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
            END
            ELSE IF ISDATE(@SearchStr) = 1  
            BEGIN
                SET @sql = 'INSERT INTO #Results SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630) 
                    FROM ' + @TableName + ' (NOLOCK) ' +
                    ' WHERE DATEDIFF(day, CONVERT(datetime, '+ @ColumnName + ', 103), ' + @SearchStr+ ') = 0'   
            END

            PRINT @sql
            EXEC sp_ExecuteSQL @sql 
GO

我收到转换错误。我需要这个存储过程来处理所有 3 种类型的数据字符串、数字和日期。

Conversion failed when converting date and/or time from character string.

谢谢

【问题讨论】:

    标签: sql-server stored-procedures sql-server-2012 date-comparison


    【解决方案1】:

    您的日期字段是日期时间?

    你应该这样对待它:

    declare @SearchStr datetime
    set @SearchStr = convert(datetime, '2012-09-10', 103) –- dd/mm/yyyy
    

    和 where 部分是这样的:

    'WHERE  Datediff(day, CONVERT(datetime, '+ @ColumnName + ', 103), ' + @SearchStr+') = 0'
    

    我认为这应该可行

    【讨论】:

      【解决方案2】:

      如果搜索字符串是日期,那么您必须进行显式转换。否则字符串将与日期时间不匹配。

      试试这样的。

      SET @SearchStr2 = CASE WHEN ISDATE(@SearchStr)=1 
        THEN CONVERT(datetime,@SearchStr,103)
        ELSE QUOTENAME('%' + @SearchStr + '%','''') END
      

      希望这会对你有所帮助。

      【讨论】:

        【解决方案3】:

        ElVieejo 的回答是正确的,但要让它最终起作用,我还需要有条件地设置 @ColumnName(取决于 IF ISDATE(@SearchStr) )。如果@SearchStr 是日期,则SET @ColumnName 的内部查询必须排除“DATA_TYPE IN ('datetime')”下的“datetime”以外的所有类型。

        【讨论】:

        • 你应该在我的答案中评论这个,所以看到答案被打勾的人会看到这个(并删除这个答案)
        猜你喜欢
        • 2021-07-28
        • 1970-01-01
        • 1970-01-01
        • 2011-01-25
        • 1970-01-01
        • 1970-01-01
        • 2018-09-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多