Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在sql中实现表的动态化_Sql_Tsql - Fatal编程技术网

如何在sql中实现表的动态化

如何在sql中实现表的动态化,sql,tsql,Sql,Tsql,是否有人知道如何在stored proc中编写脚本以基于变量运行表(或者是否有可能这样做?) 例如: 我有3个表名为customer、supplier和support 当用户输入1时,则运行表客户、2表供应商和3表支持 declare @input int; if @input =1 begin declare @table varchar(50); set @table = 'customer' end if @input =2 begin declare @table varchar(5

是否有人知道如何在stored proc中编写脚本以基于变量运行表(或者是否有可能这样做?)

例如: 我有3个表名为customer、supplier和support

当用户输入1时,则运行表客户、2表供应商和3表支持

declare @input int;

if @input =1
begin
declare @table varchar(50); set @table = 'customer'
end

if @input =2
begin
declare @table varchar(50); set @table = 'supplier '
end

if @input =3
begin
declare @table varchar(50); set @table = 'support'
end 

select *
INTO ##test
from  @table

是的,您可以通过使用动态sql“EXEC”或“Sp_Executesql”命令来实现

例如:

USE Northwind
GO


CREATE TABLE #MyTemp
   (  RowID    int  IDENTITY,
      LastName varchar(20)
   )

DECLARE @SQL nvarchar(250)
SET @SQL = 'INSERT INTO #MyTemp SELECT LastName FROM Employees;'
EXECUTE sp_executesql @SQL

是的,您可以通过使用动态sql“EXEC”或“Sp_Executesql”命令来实现

例如:

USE Northwind
GO


CREATE TABLE #MyTemp
   (  RowID    int  IDENTITY,
      LastName varchar(20)
   )

DECLARE @SQL nvarchar(250)
SET @SQL = 'INSERT INTO #MyTemp SELECT LastName FROM Employees;'
EXECUTE sp_executesql @SQL

如果真的那么简单,为什么不重复选择呢

if @input =1
begin
Select * INTO ##test From customer
end

if @input =2
begin
Select * INTO ##test From supplier
end

if @input =3
begin
Select * INTO ##test From support
end

如果真的那么简单,为什么不重复选择呢

if @input =1
begin
Select * INTO ##test From customer
end

if @input =2
begin
Select * INTO ##test From supplier
end

if @input =3
begin
Select * INTO ##test From support
end

你为什么要这样做?乍一看,这似乎是个坏主意

您可以发布存储过程正在执行的操作以及任何相关的表吗?我怀疑您可以:

  • 以这种方式修改您的模式 你再也不想做了 这个
  • 创建不同的存储过程 在每个表上执行您想要的操作,而不是将其强制到一个进程中

  • 使用动态SQL时会出现一些问题,您应该注意这些问题。是一篇关于利弊的相当全面的文章。

    为什么要这样做?乍一看,这似乎是个坏主意

    您可以发布存储过程正在执行的操作以及任何相关的表吗?我怀疑您可以:

  • 以这种方式修改您的模式 你再也不想做了 这个
  • 创建不同的存储过程 在每个表上执行您想要的操作,而不是将其强制到一个进程中

  • 使用动态SQL时会出现一些问题,您应该注意这些问题。是一篇关于优缺点的相当全面的文章。

    具体内容将取决于您的实际数据库(SQL Server、Oracle、MySQL等),但您应该回答的第一件事是:为什么希望单个存储过程有条件地从三个表中的一个表生成结果,每个都有不同的结构?我同意W.Craig Trader的观点。这让我想起了Sphere的一段电影语录:Ted:“我必须去洗手间。”Harry:“只要去你的腿上,Ted。”Ted:“真的,你可以在里面小便吗?”Harry:“你可以,问题是,你愿意。”具体细节取决于你的实际数据库(SQL Server、Oracle、MySQL等),但您应该回答的第一件事是:为什么希望一个存储过程有条件地从三个表中的一个生成结果,每个表都具有不同的结构?我同意W.Craig Trader的观点。这让我想起了Sphere的一段电影语录:Ted:“我必须去洗手间。”Harry:“只要顺着你的腿走,Ted。”Ted:“真的,你可以在里面小便吗?”Harry:“你可以,问题是,你愿意。”