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/
来源: 轻烟随风的博客
文章版权归作者所有,欢迎转载
共有 0 条评论