我想知道如何在SQL Server 2008的存储过程中操作ntext数据类型.我们在表中有一个类型为ntext的列.我们必须从该列获取数据,解析数据,更改然后将其存储回来.对于上述所有任务,我们必须使用一个或多个存储过程/函数.因此,还涉及存储过程之间的数据传递.
sql sql-server stored-procedures sql-function sql-server-2008
我有一个表如下所示..它有多个列用于不同的延迟
Date API Latency1_Avg Latency1_Min Latency1_Max Latency2_Avg Latency2_Min Latency2_Max
---- --- ------------ ------------ ------------ ------------ ------------ ------------
7/26/13 Foo 12 35 45 453 433 435
7/26/13 Bar 33 33 33 234 243 234
Run Code Online (Sandbox Code Playgroud)
我想输出一个表,将每行分成多行,如下所示
Date API Latency Aggregation Value
---- ---- ------- ----------- -----
7/26/13 Foo Latency1 Avg 12
7/26/13 Foo Latency1 Min 35
7/26/13 Foo Latency1 Max 45
7/26/13 Foo Latency2 Avg 453
7/26/13 Foo Latency2 Min 433
7/26/13 Foo Latency2 Max 435
Run Code Online (Sandbox Code Playgroud)
.....
现在,我正在做的是这个
SELECT
Date,
API,
"Latency1" …Run Code Online (Sandbox Code Playgroud) 是否存在类似COALESCE但不是值的函数NULL?
如果返回字符串文字,我需要用另一个值替换标量值函数的返回值N/A.如果它会返回NULL我可以使用:
SELECT COALESCE(dbo.GetFirstSsnInFromSsnOut(RMA.IMEI), RMA.IMEI) AS [IMEI to credit]
, OtherColumns
FROM dbo.TableName
Run Code Online (Sandbox Code Playgroud)
但既然它返回N/A这不起作用.我也可以用:
SELECT CASE WHEN dbo.GetFirstSsnInFromSsnOut(RMA.IMEI)='N/A'
THEN RMA.IMEI
ELSE dbo.GetFirstSsnInFromSsnOut(RMA.IMEI)
END AS [IMEI To Credit]
, OtherColumns
FROM dbo.TableName
Run Code Online (Sandbox Code Playgroud)
但这样效率很低,因为它需要每个记录执行两次函数.
请注意,此查询位于表值函数中.
我正在使用现有项目,但是我发现了一个具有sql-function的sql查询
SELECT * FROM money WHERE amount = float_convert(0.1);
Run Code Online (Sandbox Code Playgroud)
该查询工作正常,但是我想查看和编辑函数float_convert();。
我已经尝试过SHOW FUNCTION STATUS,
它仅显示函数状态,我需要查看函数定义。
我是PG的新手,并尝试从MSSQL转换.
我正在开发一个将返回JSON结果的函数.这个工作:
Create Or Replace Function ExampleTable_SelectList()
Returns JSON As
$$
Select array_to_json(array_agg(row_to_json(t))) From
(Select id, value1, value2, From ExampleTable) t
$$ Language SQL;
Run Code Online (Sandbox Code Playgroud)
现在,我想调用可以更新的返回值并将该值转换为JSON以返回.所以,这个给出了set命令的错误.
Create Or Replace Function ExampleTable_Update (id bigint, value1 text)
Returns JSON As
$$
Select row_to_json(t) From
(
Update ExampleTable
Set Value1 = value1
Where id= id
Returning Value1, Value2;
) t
$$ Language SQL;
Run Code Online (Sandbox Code Playgroud)
我怀疑Postgres不允许将该UPDATE语句作为子查询.那还有吗?
我需要编写一个脚本来创建并调用一个名为的函数fnItemTotal,该函数计算表中商品的总金额OrderItems(折扣价格乘以数量)。
为此,该函数应该接受一个商品 ID 参数,它应该使用我之前创建的 DiscountPrice 函数,并且应该返回该商品的总计值。
这是我创建的函数,它被创建了。但是当我尝试调用它时,它给出了错误。
CREATE FUNCTION fnItemTotal
(@ItemID INT )
RETURNS MONEY
BEGIN
RETURN
(
SELECT
ItemId,
(SELECT * FROM dbo.fnDiscountPrice(ItemID) WHERE ItemID=@ItemID)*Quantity)--The fnDiscountPrice is the Other function i created.
FROM
OrderItems
WHERE
ItemID=@ItemID
);
END
GO
Run Code Online (Sandbox Code Playgroud)
这就是我用来称呼它的方式:
Select ItemID,dbo.fnItemTotal(ItemID) AS 'Total Price'
from OrderItems
ORDER BY ItemID;
Run Code Online (Sandbox Code Playgroud)
这是我调用它时给我的错误:
消息 208,级别 16,状态 3,第 2 行 对象名称“dbo.fnDiscountPrice”无效。
我尝试编写一个函数,column3 根据表中的值在表中插入一些值,但我不太熟悉在 Postgresql 9.6 中编写函数。
--Create some table
CREATE TABLE test(column1 INT, column2 INT, column3 TEXT)
INSERT INTO test VALUES(-8020,15),(-200,1),(23,115)
--Build function
CREATE OR REPLACE FUNCTION new_function()
RETURNS TEXT AS
$$
BEGIN
IF test(column1) <= -7000 THEN INSERT INTO test(column3) VALUES('small');
ELSIF test(column1) >= -7000 AND test(column2) <= 15 THEN INSERT INTO test(column3) VALUES('nohello');
ELSIF test(column1) >= -7000 ANDtable(column2) >= 15 THEN INSERT INTO test(column3) VALUES('test');
ELSE INSERT INTO test(column6) VALUES("nodata");
END IF;
END;
$$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
结果应该是一个如下所示的表:
Column1 …Run Code Online (Sandbox Code Playgroud) 我有一个 SQL 函数,其参数名称为 id。但是,我有一个具有相同名称 id 的列名。我如何告诉函数如何区分参数和列。如果我将参数名称从 id 更改为 num,我的函数可以完美运行,但这不是这里的选项,而且我也无法更改列名称。
create or replace function
test(id integer) return text
as $$
select address
from customers c
where c.id = id
$$ language sql;
Run Code Online (Sandbox Code Playgroud) 我有这个SQL函数,它由一个存储过程包装:
ALTER FUNCTION dbo.GetObjList
(
@filterUID int = NULL,
@filterSID varchar(32) = NULL
)
RETURNS TABLE
AS
RETURN
SELECT ROW_NUMBER() OVER (ORDER BY UID) AS [RowNumber], *
FROM ObjTable
WHERE
(COALESCE(@filterUID, @filterSID) IS NULL) OR
(
((@filterUID IS NOT NULL) AND (UID = @filterUID)) OR
((@filterSID IS NOT NULL) AND (SID = @filterSID))
)
Run Code Online (Sandbox Code Playgroud)
为什么我会收到这样的错误:"将varchar值'abc'转换为数据类型int时转换失败." 如果我只@filterSID = 'abc'作为参数传递(和其他人的DEFAULT)?
我注意到COALESCE负责这个错误.
编辑:现在我得到了错误的原因...并且考虑到我实际上有很多参数...你们会推荐什么作为解决方案?
我想通过psql在空数据库中加载一些SQL函数:
psql -d my_database -f fuctions.sql --set ON_ERROR_STOP=1
Run Code Online (Sandbox Code Playgroud)
我使用--set ON_ERROR_STOP=1是因为如果脚本包含错误,我希望psql失败.
内容functions.sql是:
CREATE or REPLACE FUNCTION test_function() RETURNS INT AS $$
SELECT id from test_table;
$$ LANGUAGE sql;
Run Code Online (Sandbox Code Playgroud)
我的问题是,psql检查test_table加载函数时是否存在并因此错误而失败:
Run Code Online (Sandbox Code Playgroud)ERROR: relation "test_table" does not exist LINE 2: SELECT id from test_table;
但我不希望psql检查表是否存在,因为我稍后会创建此表.
以下解决方法可行,但我无法使用它们:
sql-function ×10
sql ×7
sql-server ×5
postgresql ×4
t-sql ×2
case ×1
coalesce ×1
database ×1
json ×1
mysql ×1
plpgsql ×1
psql ×1
sql-update ×1