0
CREATE TABLE myTable99 (TABLE_NAME sysname, COLUMN_NAME sysname, Occurs int)
GO

SET NOCOUNT ON

DECLARE @SQL varchar(8000),
@TABLE_NAME sysname, 
@COLUMN_NAME sysname,
@Sargable varchar(80), 
@Count int

SELECT @Sargable = 'PS'

DECLARE insaneCursor CURSOR FOR 
SELECT c.TABLE_NAME, c.COLUMN_NAME 
  FROM INFORMATION_SCHEMA.Columns c INNER JOIN INFORMATION_SCHEMA.Tables t
    ON t.TABLE_SCHEMA = c.TABLE_SCHEMA AND t.TABLE_NAME = c.TABLE_NAME
 WHERE c.DATA_TYPE IN ('char','nchar','varchar','nvarchar','text','ntext')
   AND t.TABLE_TYPE = 'BASE TABLE'

OPEN insaneCursor

FETCH NEXT FROM insaneCursor INTO @TABLE_NAME, @COLUMN_NAME

WHILE @@FETCH_STATUS = 0
BEGIN
    SELECT @SQL = 'INSERT INTO myTable99 (TABLE_NAME, COLUMN_NAME, Occurs) SELECT '
            + '''' +  @TABLE_NAME + '''' + ','
            + '''' + @COLUMN_NAME + '''' + ','
            + 'COUNT(*) FROM [' + @TABLE_NAME  
            + '] WHERE [' + @COLUMN_NAME + '] Like '
            + ''''+ '%' + @Sargable + '%' + ''''
    --SELECT @SQL
    EXEC(@SQL)
    IF @@ERROR <> 0 
    ------ <> means Not Equal To
        BEGIN 
            SELECT @SQL
            SELECT * FROM INFORMATION_SCHEMA.Columns WHERE TABLE_NAME = @TABLE_NAME
            GOTO Error
        END 
    FETCH NEXT FROM insaneCursor INTO @TABLE_NAME, @COLUMN_NAME
END

SELECT * FROM myTable99 WHERE Occurs <> 0 

Error:
CLOSE insaneCursor
DEALLOCATE insaneCursor

GO

DROP TABLE myTable99
GO

SET NOCOUNT OFF

次のストアド プロシージャは文字列 'PS' を検索し、COLUMN_NAME と TABLE_NAME を返しますが、対応する列に PS の ID 値が必要です

元:

    ID      NAME
     2      PW
     3      PS

現在、ストアド プロシージャは COLUMN_NAME、TABLE_NAME のみを返しますが、COLUMN_NAME および TABLE_NAME と共に文字列 'PS' を検索するときに 3 の ID が必要です

で試しました

 SELECT @SQL = 'INSERT INTO myTable99 (TABLE_NAME, COLUMN_NAME, Occurs) SELECT *'
             + 'FROM [' + @TABLE_NAME  
             + '] WHERE [' + @COLUMN_NAME + '] Like '
             + ''''+ '%' + @Sargable + '%' + ''''                                                               

ただし、ストアドプロシージャは、文字列がテーブルに見つからない場合でも、データベース内のすべてのテーブルと列の名前を返しました

myTable99

    TABLE_NAME  COLUMN_NAME  Occurs
     project     projectname  2
     task        name         1

ここで、テーブル project の projectname 'PS' の ID を取得する名前 ID を持つ新しい列が必要です

期待される結果:

テーブル プロジェクトに PS エントリがあるとします。

テーブル名: プロジェクト

列:

          ID  projectname 
           2    PR
           3    PS

これで、ストアド プロシージャは ID ではなく を返しますTable_Name=Project。3column_Name=projectnameである文字列 PS の ID が必要です

結果: string='PS' を検索すると

 ID   TABLE_NAME  COLUMN_NAME  Occurs
 3    Project     projectname   1
4

1 に答える 1

0

あなたの質問はあまり明確ではありません.projectIdをmyTable99の残りの列と一緒に持ってくる必要があると思います. 次のことができます。

--++++++++++++++++++++++++++++++++++++++++++++++++
--Before/after your cursor (not within the cursor)
DECLARE @ProjectId INT 

--Assuming projectName as a unique constraint
SELECT @ProjectId = ProjectId
FROM yourProjectTable
WHERE projectName = @Sargable

--++++++++++++++++++++++++++++++++++++++++++++++++    

--At the end, replace your select query with
SELECT TABLE_NAME, COLUMN_NAME, Occurs, @ProjectId ProjectId
FROM myTable99 
WHERE Occurs <> 0 
于 2013-10-16T09:39:33.450 に答える