[英]How to set column values as column name in pl SQL but I don't know what what will be the column values?
[英]how to find tables that have column values if i don't know the table
我們有一個由第三方創建的用於工作的應用程序。 因此,我們可以訪問UI,而不能訪問后端代碼。 在此應用程序上有一個下拉列表。 我確實可以訪問運行該應用程序的MSSQL DB。
我需要知道此下拉列表從何處獲取信息,但我不知道它使用的是哪個表(因為我無法直接檢查代碼)。
我可以寫一個查詢來在整個數據庫中搜索具有包含特定值的列的表嗎?
下拉列表值為:
您可以使用SQL Server Profiler或擴展事件會話來捕獲針對數據庫的已執行語句。 最簡單的方法是使用SSMS XEvent Profiler功能(在Management Studio版本17.3中引入)。 本質上,您開始捕獲執行的語句,打開應用程序以使其加載列表,停止跟蹤並查看捕獲的查詢以確定數據源。
您可以根據INFORMATION_SCHEMA.COLUMNS中的信息嘗試生成並執行動態SQL語句:
DECLARE @stm nvarchar(max)
SET @stm = N''
SELECT @stm = @stm +
N'SELECT ' +
N'''' + TABLE_NAME + N''' AS TableName, ' +
N'''' + COLUMN_NAME + N''' AS ColumnName, ' +
QUOTENAME(COLUMN_NAME) +
N' FROM ' + QUOTENAME(TABLE_NAME) +
N' WHERE ' + QUOTENAME(COLUMN_NAME) + N' IN (''WebsiteAPP'', ''BOT App'', ''Walkin'', ''BotLead''); '
FROM INFORMATION_SCHEMA.COLUMNS
WHERE
DATA_TYPE = ('varchar') OR
DATA_TYPE = ('nvarchar');
PRINT @stm
EXEC sp_executesql @stm
或者只是將所有SQL語句放在表中並根據需要執行它們:
SELECT
N'SELECT ' +
N'''' + TABLE_NAME + N''' AS TableName, ' +
N'''' + COLUMN_NAME + N''' AS ColumnName, ' +
QUOTENAME(COLUMN_NAME) +
N' FROM ' + QUOTENAME(TABLE_NAME) +
N' WHERE ' + QUOTENAME(COLUMN_NAME) + N' IN (''WebsiteAPP'', ''BOT App'', ''Walkin'', ''BotLead''); '
FROM INFORMATION_SCHEMA.COLUMNS
WHERE
DATA_TYPE = ('varchar') OR
DATA_TYPE = ('nvarchar');
您可以查詢sys.tables
和sys.columns
來找到包含文本信息的table.column列表,然后從中生成許多sql查詢, select [columnname] from [tablename] where [columnname] in ('value1','value2')
USE AdventureWorks;
GO
SET NOCOUNT ON;
DECLARE @T TABLE (ColumnName SYSNAME, TableName SYSNAME);
DECLARE
@SearchString VARCHAR(255) = 'Simon',
@SQL NVARCHAR(MAX);
DECLARE CUR CURSOR LOCAL FAST_FORWARD FOR
SELECT
'SELECT ' +
QUOTENAME(c.name) + ', ''' +
OBJECT_SCHEMA_NAME(c.object_id) + '.' + OBJECT_NAME(c.object_id) +
''' FROM ' + QUOTENAME(OBJECT_SCHEMA_NAME(c.object_id)) + '.' + QUOTENAME(OBJECT_NAME(c.object_id)) +
' WHERE ' + QUOTENAME(c.name) + ' = ''' + @SearchString + ''';'
FROM
sys.columns c
INNER JOIN
sys.types t
ON c.user_type_id = t.user_type_id
WHERE
c.collation_name IS NOT NULL
AND t.name NOT IN ('text','ntext')
AND OBJECTPROPERTY(c.object_id,'IsSystemTable') = 0
AND OBJECTPROPERTY(c.object_id,'IsMSShipped') = 0
AND OBJECTPROPERTY(c.object_id,'IsTable') = 1;
OPEN CUR;
FETCH CUR INTO @SQL;
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @SQL;
INSERT INTO @T
EXEC sp_executesql @SQL;
FETCH CUR INTO @SQL;
END;
CLOSE CUR;
DEALLOCATE CUR;
SELECT DISTINCT
*
FROM
@T;
您可以通過以下查詢來實現所需的功能,只需將MyDatabase
替換為數據庫名稱(代碼中必要的注釋)即可:
-- define cursor to loop through all columns
declare crs cursor for
select object_name(object_id), name from MyDatabase.sys.columns
where collation_name is not null --here we add this constraint to check only varchar columns
declare @tableName varchar(1000), @columnName varchar(1000), @sql varchar(1000);
open crs
fetch next from crs into @tableName, @columnName
while @@FETCH_STATUS = 0
begin
-- craete dynamic sql, which will check if all values exist in that column, if so, print table name
set @sql = 'if exists(select * from MyDatabase..' + @tableName + ' where ' + @columnName + ' = ''Value1'') ' +
-- to add more values, just modify this dynamic sql (add another exist(...))
'and exists(select * from MyDatabase..' + @tableName + ' where ' + @columnName + ' = ''Value2'') '
'and exists(select * from MyDatabase..' + @tableName + ' where ' + @columnName + ' = ''Value3'') print ''' + @tableName + ''';'
exec (@sql)
fetch next from crs into @tableName, @columnName
end
close crs
deallocate crs
注意 :它將產生一些錯誤,但是其中將打印表名稱,只需查找即可:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.