小编Ker*_*mit的帖子

SELECT ROW_NUMBER() 是否保证返回按生成的行号排序的结果?

例如考虑 SQL 查询:

SELECT
   A.[Name],
   ROW_NUMBER() OVER(ORDER BY A.[Name] ASC)
FROM
   [FooTable] AS A
Run Code Online (Sandbox Code Playgroud)

在这里,我观察到按 A.[Name] 排序的返回结果。如果我将 ROW_NUMBER 函数中定义的排序列更改为另一列,那么结果将再次按该列排序。

我希望将行号分配给行,但我不希望这些行按照相同的标准进行排序。这仅仅是查询执行方式的副作用(在我的情况下是在 SQL Server 2008 R2 上)还是这种行为是否有保证?(我找不到这样的保证的参考)。

order-by sql-server-2008-r2

12
推荐指数
2
解决办法
1万
查看次数

函数因空大小写操作而挂起

我创建了一个接受开始和结束日期的函数,结束日期是可选的。然后我CASE在过滤器中写了一个,如果没有通过结束日期,则使用开始日期。

CASE WHEN @dateEnd IS NULL
    THEN @dateStart
    ELSE @dateEnd
END
Run Code Online (Sandbox Code Playgroud)

当我为最近一个月的数据调用函数时:

SELECT * FROM theFunction ('2013-06-01', NULL)
Run Code Online (Sandbox Code Playgroud)

...查询挂起。如果我指定结束日期:

SELECT * FROM theFunction ('2013-06-01', '2013-06-01')
Run Code Online (Sandbox Code Playgroud)

... 结果正常返回。我从函数中取出代码并在查询窗口中正常运行。我也不能复制小提琴的问题。像这样的查询:

SELECT * FROM theFunction ('2013-04-01', '2013-06-01')
Run Code Online (Sandbox Code Playgroud)

...也工作正常。

查询(下面)中是否有任何内容可能导致函数NULL在结束日期传递时挂起?

SQL小提琴

  • 执行计划SELECT * FROM theFunction ('2013-06-01', '2013-06-01')
  • 预计计划SELECT * FROM theFunction ('2013-06-01', NULL)

sql-server sql-server-2008-r2

9
推荐指数
1
解决办法
1175
查看次数

导入数据的解决方法

我正在尝试将数据导入 SQL Server。我可以通过导入和导出数据向导导入。我无法使用BULK IMPORTOPENROWSET因为文件不在服务器机器上从我的机器导入。IED 向导如何将数据插入其目标数据库?是一行一行的吗?

从我的机器导入数据还有其他可能的解决方案吗?

sql-server-2008 import

6
推荐指数
1
解决办法
225
查看次数

计算天数并平均分配剩余天数

我在计算给定时间段内在日期范围内分布的小时数计算剩余天数时遇到了困难。对于此示例,时间段将是 2013-11-01 到 2013-05-01(它始终是 6 个月的时间段)。

这张calendar桌子有一个 30 年的套装。11 for 的值weekday表示周一至周五。

设置

CREATE TABLE #calendar (
  [d] date PRIMARY KEY,
  [weekday] tinyint DEFAULT 0,
);

INSERT INTO #calendar ([d]) VALUES
('2006-01-01', 0),
...
('2013-01-01', 1),
('2013-01-02', 1),
('2013-01-03', 1),
...
('2014-12-28', 0),
('2014-12-29', 1),
('2014-12-30', 1),
('2014-12-31', 1),
...
('2035-12-31', 1);

CREATE TABLE #tasks (
  [task] int PRIMARY KEY,
  [begin] date,
  [end] date,
  [hours] decimal(6,3)
);

INSERT INTO #tasks ([task], [begin], [end], [hours]) VALUES …
Run Code Online (Sandbox Code Playgroud)

sql-server

6
推荐指数
1
解决办法
1415
查看次数

将表从服务器复制到服务器的最佳实践

不是 DBA 并且没有进行备份/恢复的系统管理员权限,以下是复制一组表的好解决方案吗?(我有一个从serverA到的链接服务器serverB

复制表

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[copyTables]
AS
-- NOCOUNT ON added to prevent extra result sets from interfering
-- with SELECT statements. XACT_ABORT ON to terminate the transaction
-- and rollback if a run-time error occurs.
SET NOCOUNT, XACT_ABORT ON

BEGIN
    DECLARE @serverName varchar(50), @dbName varchar(50), @schemaName varchar(50)

    SET @serverName = QUOTENAME('serverB')
    SET @dbName = QUOTENAME('db')
    SET @schemaName = QUOTENAME('dbo')

    BEGIN TRY
        BEGIN TRANSACTION

        EXEC [dbo].[copyTable] @serverName, …
Run Code Online (Sandbox Code Playgroud)

sql-server stored-procedures

5
推荐指数
1
解决办法
203
查看次数

成对交叉点

我有一个包含两列的表,比如说名字和姓氏。我需要另一个表,其中对于第一对中的每一对名字,都包含共同姓氏的计数。

这在 SQL 中可行吗?

如果姓氏的唯一性会影响查询的效率,则姓氏的唯一性比名字的唯一性要多得多。

一个玩具示例,输入:

FirstName, LastName
John, Smith
John, Doe
Jane, Doe
Run Code Online (Sandbox Code Playgroud)

输出:

FirstName1, FirstName2, CommonLastNames
John, John, 2
John, Jane, 1
Jane, Jane, 1
Jane, John, 1
Run Code Online (Sandbox Code Playgroud)

由于这种关系是自反且对称的,因此如果结果只是三角形之一(例如,对角线上方的三角形)也没关系。

vertica

4
推荐指数
1
解决办法
986
查看次数

文件导入的动态文件名

我试图找出一种方法,可以将文件名传递到可以导入文件的存储过程中。但是,动态设置SQL后,找不到对象。

DECLARE @fileName varchar(200), 
    @sql varchar(max);

SET @fileName = 'C:\file.csv';

SET @sql = 'SELECT *
    INTO #import
    FROM OPENROWSET(BULK ''' + @fileName + ''',
    FORMATFILE=''C:\format.xml'',
    FIRSTROW = 2) AS a';

EXEC(@sql);

SELECT * INTO #stage
FROM #import;
Run Code Online (Sandbox Code Playgroud)

结果

(27823 row(s) affected)
Msg 208, Level 16, State 0, Line 29
Invalid object name '#tmtImport'.
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2008-r2 openrowset

3
推荐指数
1
解决办法
3226
查看次数