0

我可以在动态 sql 中动态传递一个表名。但我需要在动态 sql 中传递多个表,并且我需要包含表名,无论我传递什么,都需要包含作为列名 Ex:

empno empname deptname tablename
101    krishna Research emp,dept

或者

101    krishna research  emp-dept

通过一张表我使用下面的代码

ALTER PROCEDURE Dynamic_SP
      @Table_Name sysname
AS
BEGIN
      SET NOCOUNT ON;
      DECLARE @DynamicSQL nvarchar(4000)
      SET @DynamicSQL = N'SELECT * FROM  ' + @Table_Name
      EXECUTE sp_executesql @DynamicSQL
END
GO

EXEC Dynamic_SP 'EMP'

现在我需要将以下查询转换为动态 sql 即

select empno,empname,deptname,emp-dept as tablename from emp inner join dept on emp.deptno=dept.deptno

提前致谢

4

2 回答 2

0

您要实现的目标非常复杂,并且可能效果不佳。您的参数太宽,并且允许太多的特殊情况很可能会破坏代码。

除非这是一些家庭作业,否则我强烈建议您放弃这种方法并创建标准存储过程。

如果你真的想创建它,那么请继续阅读 a1ex07 写的更详细的帖子。这里还有几篇文章可以帮助您入门。

使用表值参数(数据库引擎)

SQL SERVER – 2008 – 表值参数介绍与示例

于 2013-07-03T05:25:00.920 回答
0

如果您需要传递多个表名,您可以创建一个新类型,例如create type SYSNAME_COLLECTION as table (table_name sysname);并将一个表变量传递给您的过程。然后遍历每一行并构建动态查询。

但是,仅仅table_name拥有还不足以生成正确的查询。SYSNAME_COLLECTION类型还应该有clause列(例如,“FROM”、“INNER JOIN”、“LEFT JOIN”等)、要选择的列列表(或公式),可能还有别名列表。由于它非常动态,您可能需要使用xmltype ; 因此,表类型的定义更改为类似

create type SYSNAME_COLLECTION as table (table_name sysname, table_alias varchar(20) not null, clause varchar(20) not null, columns xml, order_num smallint, primary key(table_name,table_alias) )

现在您需要在循环(以及读取 xml 列的内部循环)中读取程序主体中的每一行,并构建您的查询。我很确定如果你有足够的时间,是有可能让它工作的;但是,我怀疑这种方法的实用性。我宁愿考虑不使用动态 sql 或让应用程序构建查询......

于 2013-07-01T18:11:20.213 回答