2014-09-26 43 views
0

我有一個存儲過程,它搜索數據庫中的所有表並返回具有搜索值的表。搜索存儲過程返回切斷列數據

我的問題是,我正在搜索的值是在表列中的一個內容的XML內的值。

當此存儲過程返回XML時,XML被截斷直到XML中間。如何對存儲過程進行更改以返回該列中的所有XML。

這是我的存儲過程。

ALTER PROC [dbo].[SearchAllTables] 
    (@SearchStr nvarchar(100)) 
AS 
BEGIN 
    DECLARE @Results TABLE(ColumnName nvarchar(370), ColumnValue nvarchar(max)) 

    SET NOCOUNT ON 

    DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110) 
    SET @TableName = '' 
    SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''') 

    WHILE @TableName IS NOT NULL 
    BEGIN 
     SET @ColumnName = '' 
     SET @TableName = (SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)) 
         FROM INFORMATION_SCHEMA.TABLES 
         WHERE TABLE_TYPE = 'BASE TABLE' 
          AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName 
          AND OBJECTPROPERTY(OBJECT_ID(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)), 'IsMSShipped') = 0 
) 

     WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL) 
     BEGIN 
      SET @ColumnName = (SELECT MIN(QUOTENAME(COLUMN_NAME)) 
          FROM INFORMATION_SCHEMA.COLUMNS 
          WHERE TABLE_SCHEMA = PARSENAME(@TableName, 2) 
           AND TABLE_NAME = PARSENAME(@TableName, 1) 
           AND DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar') 
           AND QUOTENAME(COLUMN_NAME) > @ColumnName) 

      IF @ColumnName IS NOT NULL 
      BEGIN 
      INSERT INTO @Results 
       EXEC ('SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630) 
         FROM ' + @TableName + ' (NOLOCK) ' + 
        ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2) 
      END 
     END 
    END 

    SELECT * FROM @Results 
END 
+2

而不是'爲nvarchar(100),使用' 'nvarchar(max)' – 2014-09-26 18:38:48

+0

你確定你的MS SQL IDE沒有被設置爲截斷數據嗎?轉到工具 - >選項 - >查詢結果 - > SQL Server - >結果到網格,並驗證「最大字符檢索」設置。 – Ash8087 2014-09-26 18:44:58

+1

請告訴我,這不是您每天使用的實際搜索算法。我已經看到(並寫入)了所有表格中的所有列的搜索條目。他們都有一個共同點。它們非常慢,會削弱你的數據庫。如果你在生產中使用它,你不妨把你的數據庫拿回來並拍攝下來。 – 2014-09-26 18:45:06

回答

1

如何使用搜索技術,其實是給予查詢與您可以將這些列, 這是我該怎麼辦,希望它可以幫助

ALTER PROCEDURE SP_SearchDBForValue 
    @search_string VARCHAR(100) 
AS 
BEGIN 

IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'SearchResultTableColumn') 
    CREATE TABLE SearchResultTableColumn (SearchStr VARCHAR(101), RecCount SMALLINT, TableName VARCHAR(100), ColumnName VARCHAR(100), CreateDate DATETIME Default GETDATE()) 
ELSE 
    DELETE FROM SearchResultTableColumn 

DECLARE 
@table_name  SYSNAME, 
@table_id  INT, 
@column_name SYSNAME, 
@sql_string  VARCHAR(2000) 

DECLARE tables_cur CURSOR FOR SELECT name, object_id FROM sys.objects WHERE type = 'U' 

OPEN tables_cur 

FETCH NEXT FROM tables_cur INTO @table_name, @table_id 

WHILE (@@FETCH_STATUS = 0) 
BEGIN 
    DECLARE columns_cur CURSOR FOR SELECT name FROM sys.columns WHERE object_id = @table_id AND system_type_id IN (167, 175, 231, 239, 35) 

    OPEN columns_cur 

    FETCH NEXT FROM columns_cur INTO @column_name 
    WHILE (@@FETCH_STATUS = 0) 
    BEGIN 
     IF @table_name <> 'SearchResultTableColumn' 
     BEGIN 
      SET @sql_string = 'DECLARE @RecCount SMALLINT '+ 
       'IF EXISTS (SELECT * FROM ' + @table_name + ' WHERE ' + @column_name + ' LIKE ''%' + @search_string + '%'') '+ 
       'BEGIN SELECT @RecCount = COUNT(*) FROM ' + @table_name + ' WHERE ' + @column_name + ' LIKE ''%' + @search_string + '%'' '+ 
       'INSERT INTO SearchResultTableColumn VALUES('''[email protected]_string+''', @RecCount,''' + @table_name + ''', ''' + @column_name + ''',GETDATE()) END ' 

      EXECUTE(@sql_string) 
     END 
     FETCH NEXT FROM columns_cur INTO @column_name 
    END 

    CLOSE columns_cur 

    DEALLOCATE columns_cur 

    FETCH NEXT FROM tables_cur INTO @table_name, @table_id 
END 

CLOSE tables_cur 

DEALLOCATE tables_cur 
END; 
GO 

DECLARE @SearchStr VARCHAR (400) 
BEGIN 
SET @SearchStr = 'A1000' 
EXECUTE SP_SearchDBForValue @SearchStr 
SELECT RecCount, 'SELECT '+ColumnName+' ColName, * FROM '+TableName+ ' WHERE '+ColumnName+' LIKE ''%' +SearchStr+ '%''' FROM SearchResultTableColumn 
END 
GO