1

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

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

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.

谢谢

4

3 回答 3

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'

我认为这应该有效

于 2012-09-10T19:20:50.907 回答
1

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

尝试这样的事情。

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

希望这会帮助你。

于 2012-09-10T19:51:19.670 回答
0

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

于 2012-09-10T22:08:12.937 回答