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  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 に答える