是否有类似"表格指针"?

时间:2016-05-24 21:14:07

标签: sql tsql

我是一个全新的SQL新手。我有两个带有值的临时表,例如:

MyTableVariable = #MyTable1
select * from MyTableVariable   /*outputs content of MyTable1*/
MyTableVariable = #MyTable2
select * from MyTableVariable   /*outputs content of MyTable2*/

现在我想知道是否可以不直接调用这两个表,而是使用"表指针"?我需要这样的东西:

{{1}}

SQL / TSQL中是否存在方法?

4 个答案:

答案 0 :(得分:2)

不,在T-SQL中没有表指针,但是有动态SQL

CREATE TABLE #MyTable(ID INT, Content VARCHAR(100));
INSERT INTO #MyTable VALUES(1,'Test 1'),(2,'Test 2');

DECLARE @dynamicTablePointer VARCHAR(100)='#MyTable';

DECLARE @cmd VARCHAR(MAX)='SELECT * FROM ' + @dynamicTablePointer;

EXEC(@cmd);

这有一些限制(例如,不能在临时SQL,函数,视图中使用),但允许动态表引用和列名。

答案 1 :(得分:2)

没有SQL Server本身不支持指针,这部分是由于结构查询语言本质上是声明性的(您没有列出必须执行的命令或步骤,而是描述了所需的结果)。考虑到这一点,表不是必须从一个方法传递到下一个方法的复杂C#或Java样式对象,而是它们是以数据库结构化格式存储的相关数据,任何具有必要权限的人都可以查询这些数据,如这样就没有必要通过指针引用它们。

有两种方法可以模拟所描述的指针样式行为。您已经提供了几个示例的一种方法是简单地使用动态SQL并将您的表作为字符串参数传递给查询。另一种方法是使用同义词,见下面的例子:

    CREATE SYNONYM [MyTableSynonym] FOR #Table1

    SELECT *
    FROM    [MyTableSynonym]

    DROP SYNONYM [MyTableSynonym]

    CREATE SYNONYM [MyTableSynonym] FOR #Table2

    SELECT *
    FROM    [MyTableSynonym]

    DROP SYNONYM [MyTableSynonym]

不推荐使用上述方法,因为我们现在使用的是同义词。

真正的问题是,这两种方法都能带来哪些好处?查询这两个表的代码量增加了,查询的复杂性增加了,代码中的错误可能会增加,尝试调试这种性质的查询将是一场噩梦。即使支持真正的指针,我也只能想到一些可能有用的场景。

答案 2 :(得分:1)

您可以在正确设计的存储过程中使用动态SQL。 如果你采用这种方法,请不要忘记使用添加适当的参数定义来避免SQL注入。

create table #MyTable1(col1 int)
create table #MyTable2(col2 int)

DECLARE @MyTableVariable NVARCHAR(50);
DECLARE @SQLString NVARCHAR(500);

--selecte from the first table
SET @MyTableVariable= '#MyTable1'
SET @SQLString =N'select * from '+@MyTableVariable+';';
EXECUTE sp_executesql @SQLString;

--select from the second table
SET @MyTableVariable = '#MyTable2'
SET @SQLString =N'select * from '+@MyTableVariable+';';
EXECUTE sp_executesql @SQLString;

答案 3 :(得分:1)

一种完全不同的方法是UNION你的两个临时表。 如果两个表具有相同的列结构,并且您需要将所有数据一起输出,则此解决方案适用。 在这种情况下,为什么不这样做: SELECT col1, col2, col3 FROM #table1 UNION ALL SELECT col1, col2, col3 FROM #table2

话虽如此,如果数据结构(列)完全不同,动态SQL就是您的解决方案。