我有一个用户定义的函数:
create function ut_FooFunc(@fooID bigint, @anotherParam tinyint)
returns @tbl Table (Field1 int, Field2 varchar(100))
as
begin
-- blah blah
end
Run Code Online (Sandbox Code Playgroud)
现在我想在另一张桌子上加入这个,就像这样:
select f.ID, f.Desc, u.Field1, u.Field2
from Foo f
join ut_FooFunc(f.ID, 1) u -- doesn't work
where f.SomeCriterion = 1
Run Code Online (Sandbox Code Playgroud)
换句话说,所有的Foo记录,其中SomeCriterion1,我想看到的Foo ID和Desc,旁边的值Field1,并Field2认为从返回ut_FooFunc的的输入Foo.ID。
这样做的语法是什么?
我见过很多人使用 COALESCE 函数代替 ISNULL。从 Internet 搜索中,我发现 COALESCE 是 ANSI 标准,因此有一个优势,即我们知道使用它时会发生什么。然而, ISNULL 似乎更容易阅读,因为它似乎更清楚它在做什么。
我也意识到 ISNULL 有点棘手,因为它在不同的数据库服务器和不同的语言中表现不同。
在我看来,所有这些都归结为风格和标准。鉴于风格是主观的,有没有理由在 ISNULL 上使用 COALESCE(反之亦然)?具体来说,一个比另一个有性能优势吗?
我正在学习 PostgreSQL 并试图弄清楚如何创建一个临时表或一个WITH可以用来代替常规表的声明,以用于调试目的。
我查看了CREATE TABLE的文档,它说VALUES可以用作查询,但没有给出示例;VALUES其中链接的条款的文档也没有示例?
所以,我写了一个简单的测试如下:
DROP TABLE IF EXISTS lookup;
CREATE TEMP TABLE lookup (
key integer,
val numeric
) AS
VALUES (0,-99999), (1,100);
Run Code Online (Sandbox Code Playgroud)
但是 PostgreSQL (9.3) 抱怨
“AS”处或附近的语法错误
我的问题是:
我怎样才能修正上面的说法?
我如何调整它以用于WITH block?
提前致谢。
如何设置默认值为当前 UTC 时间的时间戳列?
MySQL 使用UTC_TIMESTAMP()UTC 时间戳函数:
mysql> SELECT UTC_TIMESTAMP();
+---------------------+
| UTC_TIMESTAMP() |
+---------------------+
| 2012-07-01 11:36:35 |
+---------------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
所以我试过:
CREATE TABLE `blah` (
`creation_time` TIMESTAMP DEFAULT UTC_TIMESTAMP,
...
Run Code Online (Sandbox Code Playgroud)
和其他变体,如UTC_TIMESTAMP(),但没有成功。
在 SQL 查询中,我们确实使用 Group by 子句来应用聚合函数。
当我看到一个看起来像这样的查询时,我正在调查一些阻塞:
SELECT SomeField FROM SomeTable NOLOCK
Run Code Online (Sandbox Code Playgroud)
我看到了NOLOCK并且很好奇它是如何阻塞其他查询的,在这种情况下是DELETE语句。我快速查看了使用的锁sp_lock,这是我所看到的:
DB S GRANT
TAB IS GRANT
PAG S GRANT
Run Code Online (Sandbox Code Playgroud)
现在,我的理解是NOLOCK应该只需要一个 Schema-Stability 锁,为什么它会抓住一个 IS 锁?
我的好奇心被勾起来了。我查看了 BOL,发现有两种使用方法,WITH (NOLOCK)以及已弃用的 . (NOLOCK),所以我决定尝试一下。我运行了以下查询,然后运行sp_lock:
SELECT SomeField FROM SomeTable WITH (NOLOCK)
Run Code Online (Sandbox Code Playgroud)
DB S 赠款 TAB Sch-S 授权
SELECT SomeField FROM SomeTable (NOLOCK)
Run Code Online (Sandbox Code Playgroud)
DB S 赠款 TAB Sch-S 授权
果然,有我的模式稳定性锁。所以我的问题是:这里发生了什么?如果使用 NOLOCK 的公认语法是WITH (NOLOCK)or (NOLOCK),那么为什么查询在只使用普通NOLOCK(不带括号)运行时不会出错?如果支持,为什么要抢 IS 锁?我在这里缺少什么?我一直在网上搜索答案,但到目前为止还不够。
我已经在 2008R2 和 2012 上对此进行了测试。
我的主要技能是使用 SQL Server,但有人要求我对 Oracle 查询进行一些调整。我编写了以下 SQL:
declare @startDate int
select @startDate = 20110501
Run Code Online (Sandbox Code Playgroud)
我得到这个错误:
declare @startDate int
select @startDate = 20110501
Error at line 1
ORA-06550: line 1, column 9:
PLS-00103: Encountered the symbol "@" when expecting one of the following:
begin function package pragma procedure subtype type use
<an identifier> <a double-quoted delimited-identifier> form
current cursor
Run Code Online (Sandbox Code Playgroud)
如何在 Oracle 中声明和使用变量?
我在应该从 Oracle 外连接语法移植到 SQL 标准外连接语法的查询中看到了以下内容:
SELECT ...
FROM A, B, C, D, E
WHERE A.A_ID = B.A_ID
AND B.B_ID = C.A_ID(+)
AND B.B_KEY = C.B_KEY(+)
AND C.C_ID = D.C_ID(+)
AND B.A_ID = E.A_ID(+)
AND B.B_KEY = E.B_KEY(+)
AND 'CONSTANT' = C.X_ID(+)
Run Code Online (Sandbox Code Playgroud)
现在翻译外连接语法通常是一个非常机械的过程,但最后一行让我感到困惑。这是什么意思?它有什么作用?
我只是在看StackOverflow上的一篇文章,其中 Aaron Bertrand 建议使用 CTE 而不是数字表,这是执行手头任务的一种优雅方式。我的问题是,为什么 CTE 的第一行以分号开头?
;WITH n AS (SELECT TOP (10000) n FROM
(SELECT n = ROW_NUMBER() OVER
(ORDER BY s1.[object_id])
FROM sys.all_objects AS s1
CROSS JOIN sys.all_objects AS s2
) AS x ORDER BY n
)
SELECT n FROM n ORDER BY n; -- look ma, no gaps!
Run Code Online (Sandbox Code Playgroud)
这是为了确保 WITH 语句不会被解析为以前的内容SELECT或其他内容吗?我在 SQL Server 2005 BOL 中没有看到关于在 WITH 之前使用分号的内容。
我们的一款产品同时支持 Oracle 和 SQL Server 作为数据库后端。我们有一位客户希望从 Oracle 后端切换到 Microsoft SQL Server,这对我们来说不是典型的过渡。
将整个 Oracle Schema 中的所有数据获取到 SQL Server 数据库中的最简单方法是什么?
模式只包含普通的旧表,没有什么花哨的。可能有一两个存储过程,我们手动迁移不会有问题。
我可以使用 Oracle 的 SQLDeveloper 将表数据导出为CREATE和INSERT语句,但这些与 SQL Server 上使用的语法不匹配,我不希望手动修复语法错误。