1

我試圖創建一個存儲過程,將搜索所有用戶創建的數據庫表中的搜索字符串。SQL 2012 - SearchAllTables爲日期時間存儲過程

我發現這個存儲過程,我想開始和建立。

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. 

謝謝

回答

1

您的日期字段是一個日期時間?

你應該traet這樣的:

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

以及其中相似的這一部分:

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

我認爲這應該工作

1

如果搜索字符串是一個日期,那麼你必須做一個明確的轉換。否則,字符串將不會與日期時間匹配。

嘗試類似這樣的東西。

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

希望這會對你有幫助。

0

ElVieejo的答案是正確的,但爲了終於正常工作,我還需要有條件地設置@ColumnName(取決於IF ISDATE(@SearchStr))。如果@SearchStr是一個日期,那麼SET @ColumnName的內部查詢必須排除除「DATA_TYPE IN('datetime')」下的'datetime'之外的所有類型。

+0

你應該在我的回答中對此進行評論,所以看到答案被打勾爲正確的人可以看到(並刪除此答案) –