如何在我的存储过程中包含所选数据库的主键值?

How to include the primary key value of the selected data base on my stored procedure?

我改编了Narayana Vyas Kondreddi in 2002最初写的剧本。我也更改了 where 子句以检查 text/ntext 字段,方法是使用 patindex 而不是 like。我还稍微更改了结果 table。不合理地,我更改了变量名,并按照我喜欢的方式对齐(没有对 Kondretti 先生的不敬)。用户可能想要更改搜索的数据类型。我使用全局 table 来允许查询中间处理,但永久性 table 可能是更明智的方法。

/* original script by Narayana Vyas Kondreddi, 2002 */
/* adapted by Oliver Holloway, 2009 */

/* these lines can be replaced by use of input parameter for a proc */
declare @search_string varchar(1000);
set @search_string = 'what.you.are.searching.for';

/* create results table */
create table ##string_locations (
  table_name varchar(1000),
  field_name varchar(1000),
  field_value varchar(8000)
)
;
/* special settings */
set nocount on
;
/* declare variables */
declare
  @table_name varchar(1000),
  @field_name varchar(1000)
;
/* variable settings */
set @table_name = ''
;
set @search_string = QUOTENAME('%' + @search_string + '%','''')
;
/* for each table */
while @table_name is not null
begin

  set @field_name = ''
  set @table_name = (
    select MIN(QUOTENAME(table_schema) + '.' + QUOTENAME(table_name))
    from INFORMATION_SCHEMA.TABLES
    where 
      table_type = 'BASE TABLE' and
      QUOTENAME(table_schema) + '.' + QUOTENAME(table_name) > @table_name and
      OBJECTPROPERTY(OBJECT_ID(QUOTENAME(table_schema) + '.' + QUOTENAME(table_name)), 'IsMSShipped') = 0
  )

  /* for each string-ish field */
  while (@table_name is not null) and (@field_name is not null)
  begin
    set @field_name = (
      select MIN(QUOTENAME(column_name))
      from INFORMATION_SCHEMA.COLUMNS
      where 
        table_schema    = PARSENAME(@table_name, 2) and
        table_name  = PARSENAME(@table_name, 1) and
        data_type in ('char', 'varchar', 'nchar', 'nvarchar', 'text', 'ntext') and
        QUOTENAME(column_name) > @field_name
    )

    /* search that field for the string supplied */
    if @field_name is not null
    begin
      insert into ##string_locations
      exec(
        'select ''' + @table_name + ''',''' + @field_name + ''',' + @field_name + 
        'from ' + @table_name + ' (nolock) ' +
        'where patindex(' + @search_string + ',' + @field_name + ') > 0'  /* patindex works with char & text */
      )
    end
    ;
  end
  ;
end
;

/* return results */
select table_name, field_name, field_value from ##string_locations (nolock)
;
/* drop temp table */
--drop table ##string_locations
;

将结果 table 定义修改为:

create table ##string_locations (
        table_name varchar(1000),
        field_name varchar(1000),
        field_value varchar(8000),
        id_field_name varchar(max),
        id int
     )

声明这些变量

@id_field_name varchar(max),
@qry varchar(max)

在此注释的正上方包含此语句'/* 在该字段中搜索提供的字符串 */'

SELECT @id_field_name = (SELECT top 1 QUOTENAME(keys.COLUMN_NAME) 
                                  FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE keys
                                 WHERE keys.TABLE_NAME =PARSENAME(@table_name, 1)
                                   and keys.TABLE_SCHEMA = PARSENAME(@table_name, 2)
                                   and OBJECTPROPERTY(OBJECT_ID(constraint_name), 'IsPrimaryKey') = 1)

将您的插入语句修改为:

 SELECT @qry = 'select ''' + @table_name + ''',''' + @field_name + ''',''' + @field_name + ''',''' + ISNULL(@id_field_name, '') + ''',' + ISNULL(@id_field_name, 'NULL') + 
    ' from ' + @table_name + ' (nolock) ' +
    'where patindex(' + @search_string + ',' + @field_name + ') > 0';
 insert into ##string_locations(table_name, 
                                field_name, 
                                field_value, 
                                id_field_name, 
                                id)
  exec(
    @qry  /* patindex works with char & text */
  )

然后修改你的结果显示:

select * from ##string_locations;

完整代码为:

 /* original script by Narayana Vyas Kondreddi, 2002 */
/* adapted by Oliver Holloway, 2009 */

 /* these lines can be replaced by use of input parameter for a proc */
 declare @search_string varchar(1000);
 set @search_string = 'Alpha';

/* create results table */
drop table ##string_locations;
create table ##string_locations (
table_name varchar(1000),
field_name varchar(1000),
field_value varchar(8000),
id_field_name varchar(max),
id int
)
;
/* special settings */
set nocount on
;
/* declare variables */
declare
@table_name varchar(1000),
@field_name varchar(1000),
@id_field_name varchar(max),
@qry varchar(max)
;
/* variable settings */
set @table_name = ''
;
set @search_string = QUOTENAME('%' + @search_string + '%','''')
;
/* for each table */
while @table_name is not null
begin

set @field_name = ''
set @table_name = (
select MIN(QUOTENAME(table_schema) + '.' + QUOTENAME(table_name))
from INFORMATION_SCHEMA.TABLES
where 
  table_type = 'BASE TABLE' and
  QUOTENAME(table_schema) + '.' + QUOTENAME(table_name) > @table_name and
  OBJECTPROPERTY(OBJECT_ID(QUOTENAME(table_schema) + '.' + QUOTENAME(table_name)), 'IsMSShipped') = 0
)

/* for each string-ish field */
while (@table_name is not null) and (@field_name is not null)
begin
SELECT @field_name =  MIN(QUOTENAME(cols.column_name))

  from INFORMATION_SCHEMA.COLUMNS cols
  where 
    cols.table_schema    = PARSENAME(@table_name, 2) and
    cols.table_name  = PARSENAME(@table_name, 1) and
    cols.data_type in ('char', 'varchar', 'nchar', 'nvarchar', 'text', 'ntext') and
    QUOTENAME(cols.column_name) > @field_name

SELECT @id_field_name = (SELECT top 1 QUOTENAME(keys.COLUMN_NAME) FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE keys
                                WHERE keys.TABLE_NAME =PARSENAME(@table_name, 1)
                                  and keys.TABLE_SCHEMA = PARSENAME(@table_name, 2)
                                and OBJECTPROPERTY(OBJECT_ID(constraint_name), 'IsPrimaryKey') = 1)


/* search that field for the string supplied */
if @field_name is not null
begin
  SELECT @qry = 'select ''' + @table_name + ''',''' + @field_name + ''',''' + @field_name + ''',''' + ISNULL(@id_field_name, 'NULL') + ''',' + ISNULL(@id_field_name, 'NULL') + 
    ' from ' + @table_name + ' (nolock) ' +
    'where patindex(' + @search_string + ',' + @field_name + ') > 0';

  insert into ##string_locations(table_name, field_name, field_value, id_field_name, id)
  exec(
    @qry
  )
end
;
end
;
end
;

select * from ##string_locations;


;

Sample Result that I want to achieve:
table_name [ProjectDescription]
field_name [dbo].[ProjectProposals]
field_value Sencha Project
ID 23