Mssql 傳入表名引數,呼叫表中的多條資料

2021-09-30 11:29:06 字數 2553 閱讀 7653

在網上找了一些例子感覺並不是很理想

create table temp1

( ydlx varchar(100),

ydbh varchar(100)

)insert into temp1( ydlx, ydbh )values ( '02','yd002')

insert into temp1( ydlx, ydbh )values ( '03','yd004')

假如傳入表名為#temp1,現在要呼叫這個表一些資料,引數@table

select *from @table

這個是肯定不行的,需要exec輸出結果值

declare @table varchar(100)

set @table ='temp1'

----------------------------------

declare @ydbh varchar(100)

declare @ydlx varchar(100)

set @ydbh=''

set @ydlx=''

declare @sql nvarchar(max)

set @sql ='select @a =ydbh,@b=ydlx from '+ @table + ''

print @sql

exec sp_executesql @sql,n'@a varchar(100) output,@b varchar(100) output',@a=@ydbh output,@b=@ydlx output

select @ydbh,@ydlx

--yd004	03  ----結果--
然而就出來一條資料,這不是我們要的結果,把上面修改下,拼接出來

set @sql ='select @a = @a +ydbh+'',''+ydlx+'';'' from '+ @table + ''	

print @sql

exec sp_executesql @sql,n'@a varchar(100) output',@a=@ydbh output

select @ydbh

--yd002,02;yd004,03; --結果--

這個資料才是我們需要的,我們只需要把@ydbh這個引數還原成以前的樣子就好了,需要多次分割

set @ydbh=left(@ydbh,len(@ydbh)-1)

--分割一下

select col,row_number()over(order by current_timestamp)id into #temp2 from dbo.f_splitstr(@ydbh,';')

declare @max int

select @max =max(id) from #temp

create table #tables

( ybh varchar(100),

ylx varchar(100)

)declare @i int

set @i=1

while(@i<=@max)

begin

declare @col varchar(50)

select @col=col from #temp2 where id=@i

insert into #tables

( ybh, ylx )values (left(@col,charindex(',',@col)-1),substring(@col,charindex(',',@col)+1,len(@col)))

set @i=@i+1

end

select * from #tables

-------結果--------
--02yd002

--03yd004

附:f_splitstr --寫好的錶值函式呼叫
alter  function [dbo].[f_splitstr](

@s     varchar(8000),  --待分拆的字串

@split  varchar(10)     --資料分隔符

)returns table

asreturn(

select col=cast(substring(@s,id,charindex(@split,@s+@split,id)-id) as varchar(100))

from tb_splitstr

where id<=len(@s+'a') 

and charindex(@split,@split+@s,id)=id)

根據上面就可以得到這個表中的資料了,貌似資料處理有點麻煩了,大神請忽略

間接實現動態傳入表名

問題是這樣,想實現select from order by 通過對?動態設定引數,實現對不同表的查詢 直接利用preparedstatement st con.preparestatement sql 然後執行 會報表名無效的錯誤 下面是間接實現這樣的操作 利用字串替換的方法 sql string....

mysql儲存過程傳入表名做引數,進行分頁處理

儲存過程 drop procedure if exists pagepro create definer root localhost procedure pagepro in pageno int,in pagesize int,in tablename varchar 50 begin decl...

Mybatis之 和 區別及動態傳入表名

動態傳入表名 能防止sql注入,不能 方式一般用於傳入資料庫物件,例如傳入表名.mybatis排序時使用order by 動態引數時需要注意,用 而不是 id 1,select from tablename select 1 from tablename 引用 id 1,select from ta...