-1
有時,我想在所有表中搜索字符串。但我發現Stackoverflow的所有答案都是使用存儲過程來完成的。這很不方便,因爲我不想在我的sql服務器中創建一個存儲過程,我只想看看我們的數據庫中存在這個字符串的位置。所以我提供了下面的解決方案來幫助任何需要它的人。如何在不使用存儲過程的情況下在所有表中找到字符串
有時,我想在所有表中搜索字符串。但我發現Stackoverflow的所有答案都是使用存儲過程來完成的。這很不方便,因爲我不想在我的sql服務器中創建一個存儲過程,我只想看看我們的數據庫中存在這個字符串的位置。所以我提供了下面的解決方案來幫助任何需要它的人。如何在不使用存儲過程的情況下在所有表中找到字符串
DECLARE @SQL VARCHAR(MAX)
DECLARE @SearchString VARCHAR(100)
SET @SQL=''
-- ------------------------------------------
-- Enter the string to be searched for here :
--
SET @SearchString='Foo'
-- ------------------------------------------
SELECT @SQL = @SQL + 'SELECT CONVERT(VARCHAR(MAX),COUNT(*)) + '' matches in column ''+'''
+ C.name + '''+'' on table '' + ''' + SC.name + '.' + T.name +
''' [Matches for '''[email protected]+''':] FROM ' +
QUOTENAME(SC.name) + '.' + QUOTENAME(T.name) + ' WHERE ' + QUOTENAME(C.name) +
' LIKE ''%' + @SearchString +
'%'' HAVING COUNT(*)>0 UNION ALL ' +CHAR(13) + CHAR(10)
FROM sys.columns C
JOIN sys.tables T
ON C.object_id=T.object_id
JOIN sys.schemas SC
ON SC.schema_id=T.schema_id
JOIN sys.types ST
ON C.user_type_id=ST.user_type_id
JOIN sys.types SYST
ON ST.system_type_id=SYST.user_type_id
AND ST.system_type_id=SYST.system_type_id
WHERE SYST.name IN ('varchar','nvarchar','text','ntext','char','nchar')
ORDER BY T.name, C.name
-- Strip off the last UNION ALL
IF LEN(@SQL)>12
SELECT @SQL=LEFT(@SQL,LEN(@SQL)- 12)
EXEC(@SQL)
--PRINT @SQL
如何使用它: 只是relace要與「富」的@SearchString搜索的字符串。那麼你應該很好去。
P.S.如果這可以幫助你,請投票回答這個問題,讓更多的開發者看到它。
感謝這個post
好像一個可以通過只刪除了''創建與DECLARE替代參數聲明的存儲過程轉換爲一個特設的腳本。請注意,此聚合字符串連接方法可能會產生意外的結果。最好使用FOR XML,或者在Azure SQL數據庫和SQL Server 2017中使用'STRING_AGG'。 –
「看來可以通過刪除CREATE並用DECLARE替換參數聲明來將存儲過程轉換爲臨時腳本」您說得對,我只是想提供此解決方案,因此開發人員無需再次將其轉換。這將節省開發人員的時間。 – EntryLeveDeveloper