2014-10-27 71 views
0

问题:我有一个表,我们可以使用属性(TableName,ColumnName)等来调用它的AllColumns。使用另一个表中的数据生成sql select语句

现在,我想实现的是为此表的每个记录生成一个select语句。

伪代码:

for (table, column) in (select TableName, ColumnName from AllColumns) do 
    select 'table', column from table where column like '%blah%' 
end for 

你能帮忙吗?

+0

您需要动态SQL来执行此操作。你熟悉'sp_executesql'还是'exec()'。如果没有,您可以通过google'ing“sql server dynamic sql”开始。 – 2014-10-27 14:32:04

+0

或者,如果您只是试图生成一些东西来保存自己的输入内容(而不是试图制作一个自动的,可重新运行的脚本来为您完成工作),则可以使用'PRINT'命令将值输出到消息窗格,然后复制/粘贴到一个新的窗口并从那里运行。 – AHiggins 2014-10-27 14:44:01

+0

是不是有像Postgres的'INFORMATION_SCHEMA.tables'? – 2014-10-27 14:47:59

回答

0

您可以使用WHILE循环和临时表。因此,您将所有记录提取到临时表中,然后循环查看记录以执行选择或您希望执行的任何过程,如下所示;

DECLARE @TempTable TABLE 
(
    ID INT IDENTITY(1,1), 
    Table Varchar(100), 
    Column Varchar(100) 
) 

INSERT INTO @TempTable 
    SELECT Table, Column FROM AllColumns 


DECLARE @LOOP INT 
DECLARE @COUNT INT 

SET @LOOP = 0 
SET @COUN = 1 

SELECT @LOOP = COUNT(1) FROM @TempTable 

WHILE @COUNT <= @LOOP 
    BEGIN 

    select 'table', column from @TempTable 
    where column like '%blah%' 
    and ID = @COUNT 

SET @COUNT = @COUNT + 1 
END 
0

可以使用动态SQL做到这一点:

DECLARE @SQL NVARCHAR(MAX); 

SET @SQL = (SELECT 'SELECT [Table] = ''' + TableName + ''', ' + 
        '  [Column] = ''' + ColumnName + ''' ' + 
        'FROM ' + TableName + ' ' + 
        'WHERE ' + ColumnName + ' LIKE ''%blah%'';' 
      FROM AllColumns 
      FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'); 

EXECUTE sp_executesql @SQL; 

然而,仅仅因为你可以做一些事情,并不意味着你应该 - 你说AllColumns有成千上万的条目,您因此运行数以千计的短的查询,其中每个生成它自己的结果集。我不能想到这是可取的许多情况。

相关问题