【发布时间】:2018-06-21 09:34:00
【问题描述】:
有没有办法解析给定的 SQL SELECT 查询并用函数调用包装每一列,例如dbo.Foo(column_name) 在运行 SQL 查询之前?
我们已经研究过在列名上使用正则表达式类型“replace”,但是,我们似乎无法解释所有可以编写 SQL 查询的方式。
SQL 查询的一个示例是;
SELECT
[ColumnA]
, [ColumnB]
, [ColumnC] AS [Column C]
, CAST([ColumnD] AS VARCHAR(11)) AS [Bar]
, DATEPART([yyyy], GETDATE()) - DATEPART([yyyy], [ColumnD]) AS [Diff]
, [ColumnE]
FROM [MyTable]
WHERE LEN([ColumnE]) > 0
ORDER BY
[ColumnA]
, DATEPART([yyyy], [ColumnD]) - DATEPART([yyyy], GETDATE());
我们需要的结果是;
SELECT
[dbo].[Foo]([ColumnA])
, [dbo].[Foo]([ColumnB])
, [dbo].[Foo]([ColumnC]) AS [Column C]
, CAST([dbo].[Foo]([ColumnD]) AS VARCHAR(11)) AS [Bar]
, DATEPART([yyyy], GETDATE()) - DATEPART([yyyy], [dbo].[Foo]([ColumnD])) AS [Diff]
, [dbo].[Foo]([ColumnE])
FROM [MyTable]
WHERE LEN([dbo].[Foo]([ColumnE])) > 0
ORDER BY
[dbo].[Foo]([ColumnA])
, DATEPART([yyyy], [dbo].[Foo]([ColumnD])) - DATEPART([yyyy], GETDATE());
上述任何或所有列可能需要对其调用的函数(包括在WHERE 和ORDER BY 中使用的列),这就是我们需要查询范围解决方案的原因。
我们有很多像上面这样的预先编写的查询需要更新,这就是手动更新很困难的原因。
上面的例子显示了一些结果列可能会被计算,而一些只是被重命名。大多数也由连接组成,有些包含我为了本示例的目的而省略的 case 语句。
另一个需要考虑的情况是表名别名,例如SELECT t1.ColumnA, t2.ColumnF等
解决此问题的 SQL 或 C# 解决方案都是理想的。
【问题讨论】:
-
Foo是做什么的?它在 C# 中做一些容易做到的事情吗?您在WHERE和ORDER BY语句中绝对需要它吗? -
它使用内置列级加密的 SQL 服务器运行一些解密逻辑。
-
该 SQL 是在数据库中的存储过程中还是在 C# 源代码中的字符串中?
标签: c# sql .net sql-server sql-function