如何在我的存储过程中包含所选数据库的主键值?
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
我改编了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