假设我有一个包含三列的表Example
:X, TableName, ColumnName
。
TableName
在数据库中存储表的名称,ColumnName
存储我要加入X
的列的名称。问题是需要将不同的行连接到不同的表(以明确定义的方式)。
我希望能够做到这样的事情:
Select *
from Example join TableName on X = ColumnName
这显然无法奏效。
我很新,并且做了一些谷歌搜索,似乎我可以使用游标循环遍历行并使用动态SQL,因为表和列的名称存储在数据库中,但我'我听说应该避免游标和动态SQL,所以我没有仔细研究过它的细节。我希望有一种解决这个问题的首选方法。
感谢。
答案 0 :(得分:3)
动态SQL 可能比存储过程慢,但并非总是如此,并且随着SQL Server的成熟而变得更好。应尽可能使用非动态SQL,因为它更清晰,更易于维护。但是,动态SQL确实有它的位置(像Entity Framework和NHibernate这样的ORM工具几乎只使用动态SQL)。如果可能的话,应该避免使用游标,但SQL确实支持可以替代使用的WHILE循环。
DECLARE @Identity int = SELECT MIN(ex.Identity) FROM Example ex
DECLARE @TableName varchar(200)
DECLARE @ColumnName varchar(200)
WHILE @Identity IS NOT NULL BEGIN
SELECT
@TableName = ex.TableName,
@ColumnName = ex.ColumnName
FROM
Example ex
WHERE
ex.Identity = @Identity
/*
build and execute your dynamic sql here
*/
SET @Identity int = SELECT MIN(ex.Identity) FROM Example ex WHERE ex.Identity > @Identity
END