1

데이터베이스의 모든 사용자가 만든 테이블에서 검색 문자열을 검색하는 저장 프로 시저를 만들려고합니다.SQL 2012 - Datetime을위한 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 

나는 변환 오류가 발생합니다. 세 가지 유형의 데이터 문자열, 숫자 및 날짜를 ​​모두 사용하려면이 저장 프로 시저가 필요합니다.

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

답변

1

날짜 필드에 날짜 감사합니다?

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

과 같은 부분 곳 :

이처럼 traet해야 검색 문자열은 날짜가 다음의 경우

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

내가 생각이

1

작동합니다 명시적인 변환을해야합니다. 그렇지 않으면 문자열이 datetime과 일치하지 않습니다.

다음과 같이 시도해보십시오.

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

내 대답에 댓글을 써야합니다. 올바른 답변을 본 사람들은 이것을보고 (이 answereR을 삭제하십시오) –