Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.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_Sql Server - Fatal编程技术网

SQL:是否可以在另一个字段中以文本形式按公式计算字段

SQL:是否可以在另一个字段中以文本形式按公式计算字段,sql,sql-server,Sql,Sql Server,是否可以制作表格或视图,这些表格或视图已按公式进行了计算 ,在其他字段中指定为文本的 例如: A B C formula value - - - - -------- ----- 1. 2 1 3 (A+B)*C 9 2. 100 null 2 A/C 50 谢谢并致以最诚挚的问候这是一个值得思考的问题。我不确定这是否是最有效的方法,但这里有一个解决方案确实有效 C

是否可以制作表格或视图,这些表格或视图已按公式进行了计算 ,在其他字段中指定为文本的

例如:

    A     B     C    formula    value
-   -     -     -   --------    -----
1.  2     1     3    (A+B)*C      9
2. 100   null   2      A/C       50

谢谢并致以最诚挚的问候

这是一个值得思考的问题。我不确定这是否是最有效的方法,但这里有一个解决方案确实有效

CREATE TABLE tmpMaths (ID INT IDENTITY(1,1), A INT, B INT, C INT, formula VARCHAR(255), formulaResult FLOAT);
INSERT tmpMaths (A, B, C, formula) VALUES (2, 1, 3, '(A+B)*C')
, (100, NULL, 2, 'A/C/C/C/A');

DECLARE @Results TABLE (ID INT, Result FLOAT);
DECLARE @SQL2 VARCHAR(MAX) = '';
SELECT @SQL2 += ' UNION ALL SELECT ' + CAST(ID AS VARCHAR(255)) + ' ID, 1.0 * ' 
    + REPLACE(REPLACE(REPLACE(formula, 'A', ISNULL(A, '')), 'B', ISNULL(B, '')), 'C', ISNULL(C, '')) 
    + ' Result FROM tmpMaths WHERE ID = ' + CAST(ID AS VARCHAR(255))
FROM tmpMaths;
SELECT @SQL2 = STUFF(@SQL2, 1, 11, '');
INSERT @Results (ID, Result)
EXEC(@SQL2);

UPDATE M SET formulaResult = R.Result --SELECT M.ID, A, B, C, formula, Result
FROM tmpMaths M
JOIN @Results R ON R.ID = M.ID;

SELECT * FROM tmpMaths;

DROP TABLE tmpMaths;
如果您不知道所有的列名,那么下面这样的内容会有点复杂,但无论如何都是有效的。。。(基本上,它通过动态SQL获取列名):


可能使用CLR函数,使用解析库。在T-SQL中,最接近的可能是CASE语句,但在这种情况下,您需要在设计时了解公式的变化。我认为函数就可以了。您只需从公式字段中获取列名,并使用它创建一个动态sql。它不需要任何解析就可以工作。@JorgeCampos,你是说创建一个函数并在函数中使用动态SQL?@Squirrel是的,我尝试过,但删除了我的答案。这里没有sqlserver进行测试。您好,谢谢。这很有帮助,但我需要一种方法从表或视图中执行此操作,以便在任何时候打开表或视图时都可以看到更新值p.s。我知道列名如果您能帮助我将查询转换为ms access查询,那将非常有帮助。要使其成为视图,只需将视图X创建为。。。然后添加适当的查询。要将其放入表中,只需从查询中更新表(例如,
updatem SET columnX=Result…
在末尾的select语句中-我在答案中添加了一个示例)。至于将其转换为Access查询,Access实际上不允许动态SQL—您可以通过其他方式(例如VB)来实现。Msg 156,级别15,状态1,过程abcf,第2行[批处理开始行0]关键字“DECLARE”附近的语法不正确。Msg 4508,16级,状态1,程序abcf,第18行[批处理起始行0]视图或函数不允许出现在临时表上。以“#”开头的表名表示临时表。Msg 4508,16级,状态1,程序abcf,第19行[批处理起始行0]视图或函数不允许出现在临时表上。以“#”开头的表名表示临时表。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
CREATE TABLE tmpMaths (ID INT IDENTITY(1,1), A INT, B INT, C INT, formula VARCHAR(255));
INSERT tmpMaths (A, B, C, formula) VALUES (2, 1, 3, '(A+B)*C')
, (100, NULL, 2, 'A/C/C/C/A');

DECLARE @replacecount INT = (
    SELECT COUNT(*)
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME = 'tmpMaths'
    AND COLUMN_NAME NOT IN ('ID', 'formula')) -- get the count of columns, unnecessary if it's always just 3 (A, B, C)
, @replace VARCHAR(MAX) = ''
, @cols VARCHAR(MAX) = '';

SELECT @replace += ', ''' + COLUMN_NAME + ''', ISNULL(' + COLUMN_NAME + ', ''''))' -- for replacing the column names in the formula
     , @cols += ', ' + COLUMN_NAME -- for selecting the columns in output, unnecessary if it's always just A, B, C
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'tmpMaths'
AND COLUMN_NAME NOT IN ('ID', 'formula');

DECLARE @selectreplace NVARCHAR(MAX) = REPLICATE('REPLACE(', @replacecount) + 'formula' + @replace; -- e.g. REPLACE(REPLACE(REPLACE(formula, 'A', A), 'B', B), 'C' C)

IF OBJECT_ID('tempdb..#tmpEvaluated') IS NOT NULL DROP TABLE #tmpEvaluated;
CREATE TABLE #tmpEvaluated (ID INT, Evaluated VARCHAR(255));
DECLARE @SQL VARCHAR(MAX) = 'INSERT #tmpEvaluated (ID, Evaluated) SELECT ID, ' + @selectreplace + ' FROM tmpMaths';
EXEC(@SQL); -- produces the formula with numbers instead of column names

IF OBJECT_ID('tempdb..#tmpResults') IS NOT NULL DROP TABLE #tmpResults;
CREATE TABLE #tmpResults (ID INT, Result FLOAT);
DECLARE @SQL2 VARCHAR(MAX) = '';
SELECT @SQL2 += ' UNION ALL SELECT ' + CAST(ID AS VARCHAR(255)) + ' ID, 1.0 * ' + Evaluated + ' Result FROM #tmpEvaluated WHERE ID = ' + CAST(ID AS VARCHAR(255))
FROM #tmpEvaluated;
SELECT @SQL2 = STUFF(@SQL2, 1, 11, '');
INSERT #tmpResults (ID, Result)
EXEC(@SQL2); -- gets the result of the formula with numbers in it (a series of UNION ALL statements)
PRINT @SQL2;

DECLARE @output VARCHAR(MAX) = 'SELECT M.ID' + @cols + ', formula, result FROM tmpMaths M JOIN #tmpResults R ON R.ID = M.ID';
EXEC(@output);

DROP TABLE tmpMaths;