SQL Server- procedure 存储过程动态传入表名-并返回dataTable(表格式)

SQL Server- procedure 存储过程动态传入表名-并返回dataTable(表格式)

只用一个procedure 存储过程,可动态传入任何表名:

1.建立测试表:

--drop table test_ta
--drop table test_tb
--drop table test_tc

create table test_ta(tableName varchar(20),type varchar(20))
insert into test_ta
select 'a',';1;2;3'

create table test_tb(tableName varchar(20),type varchar(20))
insert into test_tb
select 'b',';4;5;6'

create table test_tc(tableName varchar(20),type varchar(20))
insert into test_tc
select 'c','7;8;9'

select * from test_ta
select * from test_tb
select * from test_tc

2.效果

 

现在我想查询其中某张表的 type ,必须用完整的语句书写 : select * from test_ta were tableName ='a',得出结果为‘;1;2;3’ 。 下次我想查询表test_tb,还需要sql再写一遍 select * from test_tb  where tableName ='b' ,得出结果为‘;4;5;6’. 也就是每查询一张不同的表,就需要select  ... where ...  语句都写一遍,重复性工作很大。现在,只需要调用一个存储过程,传入任何表名称 【A,列,where 条件列名,where 参数值 ,表A该where参数值的分隔符】,就能查询出该表A 的值,并转化为dataTable 的格式。

建立两个 procedure 和一个 function:

1、主 procedure:

Create procedure [dbo].[stp_wf_ndi_GridDynamicTableColumnToDataSet]
(
@tablename varchar(100),
@columnName varchar(100),
@columnParm1 varchar(100), --where 后的参数列 比如 item_id
@whereparm1 varchar(100), --where 后的参数 --'00126620NDI00000004'
@split nvarchar(2) --分隔的字符串,列名最前面必须要有分隔符, 比如 ;WEST_CHINA;EAST_CHINA
)
as
declare @a nvarchar(max)
exec stp_wf_ndi_LoadDynamicTableColumnValue @tablename,@columnName,@columnParm1,@whereparm1,@a output
select isnull(col,'') from udf_wf_ndi_GridStringSplit(@a,';')

2、调用的次procedure:

create PROCEDURE [dbo].[stp_wf_ndi_LoadDynamicTableColumnValue]
(
@tableName varchar(500), --需要查询的表名
@columnName varchar(100), --需要查询的列名
@columnParm1 varchar(100), --where后的条件参数列名
@whereparm1 varchar(100) , --where后的条件参数列名的值 --'00126620NDI00000004'
@result nvarchar(1000) output --返回给上一个存储过程的字符结果
)AS
BEGIN
SET NOCOUNT ON;
Declare @sql nvarchar(MAX)
set @sql = 'select @aaa='+ @columnName +' from '+ @tableName +' where ' + @columnParm1 + ' = ''' + @whereparm1 +''''
exec sp_executesql @sql,N'@aaa nvarchar(1000) out',@result out
END

3、调用的字符串分割成datatable 的 function:

CREATE FUNCTION [dbo].[udf_wf_ndi_GridStringSplit]
(
@c VARCHAR(MAX) , --- @c 为固定格式,第一位必须有分隔符比如 ;A;B;C
@split VARCHAR(50)
)
RETURNS @t TABLE ( col NVARCHAR(100) )
AS
BEGIN
if CHARINDEX(@split, @c) <> 0 --首次去掉第一个分隔符,防止插入空符号到表格, 供下面使用
begin
SET @c = STUFF(@c, 1, CHARINDEX(@split, @c), '')
end
WHILE ( CHARINDEX(@split, @c) <> 0 )
BEGIN
INSERT @t( col )
VALUES ( SUBSTRING(@c, 1, CHARINDEX(@split, @c) - 1) )
SET @c = STUFF(@c, 1, CHARINDEX(@split, @c), '')
END
INSERT @t( col ) VALUES ( @c ) --把最后一部分内容插入表
RETURN
END

4、测试结果

把以上三个创建好后,新开查询分析器,执行以下内容, 只要改变参数就可以查询不同表的字段了,是不是很方便:

exec stp_wf_ndi_GridDynamicTableColumnToDataSet 'test_ta','type','tableName','a',';'
exec stp_wf_ndi_GridDynamicTableColumnToDataSet 'test_tb','type','tableName','b',';'
exec stp_wf_ndi_GridDynamicTableColumnToDataSet 'test_tc','type','tableName','c',';'

表格中字段的值提前设置为 ;1;2;3 ,就是为了方便被执行后,转换成 DataTable 结果集,可以被asp.net 的 dropdownlist或者gridview等控件调用

作者: 轻烟随风
当前文章地址: https://www.zyxpp.com/sql-server-exec-procedure-dynamic/
来源: 轻烟随风的博客
文章版权归作者所有,欢迎转载
THE END
分享
二维码
< <上一篇
下一篇>>