小编GWR*_*GWR的帖子

*为什么* SQL Server 调试器需要系统管理员权限

我最近发布了一个问题,希望找到一种替代方法来授予开发人员sysadmin特权以使用 sql server 调试器。我发现确实没有可行的解决方案。

我的问题是,为什么sql server 调试器需要 sysadmin 权限?我想了解以这种方式设计它背后的原因。

在开发环境中,开发人员应该能够在不授予系统管理员权限的情况下进行开发活动,例如使用内置调试器工具,而不是被告知使用打印语句等基本上构建自己的调试机制。

SQL Server 拥有如此多的特定角色/任务等的特权,奇怪的是没有看到一个单独的角色/任务,例如只能在开发环境中授予的权限等。

我不认为这个问题是其他问题的重复,因为这个问题不是关于如果你不是系统管理员如何使用调试器,而是这样我可以理解为什么它是这样设计的

sql-server permissions

5
推荐指数
0
解决办法
78
查看次数

SQLCMD 导出 1650 万行

我正在使用 sqlcmd 将表导出到 TSV 文件,但遇到了问题。该表有 16 多万行和大约 55 列。

问题是它没有导出完整的表,但似乎在各个点随机停止(我猜是超时?)每次导出不同数量的行并且每次文件的大小略有不同(表明我没有达到任何行或大小限制)。

我没有使用任何超时开关(意味着使用“只要需要”的默认值)。

这是我的命令(为了简化和说明目的,删除了大多数列):

sqlcmd -U myUsername -P myPassword -S SERVERNAME -d "DBNAME" -Q "SELECT ROW_KEY, ISNULL(CARRIER_ID, ''),ISNULL(CONVERT(VARCHAR(19),ORDER_DATETIME,120),''),ISNULL(HEIGHT, ''),ISNULL(RESIDENTIAL_CHARGE, '') FROM MYTABLE" -o "OUTPUT_FILE.txt" -h-1 -s"|" -W
Run Code Online (Sandbox Code Playgroud)

我想知道它是否与超时或在所有列上使用 ISNULL() 有关(尽管当我在 sql server management studio 中运行查询时,我得到了正确的行数,例如 1600 万+)?

同样,我每次得到大约 4-8 百万行,但从来没有得到全部。我在 sql server 2k5 db 中,并从带有 sql server 2k8 的远程机器运行 sqlcmd。

sql-server sqlcmd

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

带有模式匹配的 WHERE 子句以查找包含不在列表中的任何字符的行

我在 SQL Server 2008 环境中。

我试图在WHERE子句中使用模式匹配来查找特定列的值包含非字母数字、下划线、破折号、句点或空格字符的行。

这是我的代码和示例数据,但我没有得到预期的结果。

在示例数据中,我想返回第 7、8、9 和 12 行,但我得到的是第 5 行和第 6 行。

如果这不是实现目标的最佳方式,我愿意听取其他方法。

我不在可以实现正则表达式的环境中,因此我的解决方案仅限于开箱即用的功能。

CREATE TABLE PATTERN_TEST
(
ID INT NOT NULL,
STRING NVARCHAR(40) NOT NULL
)

INSERT INTO PATTERN_TEST
SELECT 1, 'string' UNION 
SELECT 2, 'STRING' UNION 
SELECT 3, 'string space' UNION 
SELECT 4, 'STRING SPACE' UNION 
SELECT 5, 'string-dash' UNION 
SELECT 6, 'string-dash space' UNION 
SELECT 7, 'string "otherchar"' UNION 
SELECT 8, 'string "other char"' UNION 
SELECT 9, '"string"' UNION 
SELECT 10, …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server

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

获取上周某天的日期

在学习如何从前一周(例如从前一周的星期一的日期)获取星期几的日期时,我发现以下两个表达式很常见,您可以在其中更改最后一个数字(例如 0=星期一)取决于您想要的那一天:

SELECT DATEADD(wk, DATEDIFF(wk, 6, GETDATE()), 0)

SELECT DATEADD(wk, DATEDIFF(wk, 7, GETDATE()), 0)
Run Code Online (Sandbox Code Playgroud)

2017-05-29当我今天(2017-06-17)运行它时,两者似乎都返回了正确的日期。

我的问题是 - 这是如何工作的?似乎是在数周后67数周后1900-01-01?为什么它同时适用于 a67

此外,是否存在需要注意的边缘情况,它可能无法提供预期结果?

sql-server t-sql datetime

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

“退回数据库”的标准含义

我最近一直在听到“反弹数据库”这个词,并对其进行了研究,似乎人们认为它意味着不同的东西。

最近是一个 Oracle DBA 说:

“即使是 DBA 也无法访问该实例,因此我们不得不退回数据库”

有标准定义吗?

在 Oracle 数据库的上下文中,我看到人们使用它来指代正常关机、立即关机或关机中止,然后重新启动。

在 SQL Server 的上下文中是否意味着相同的事情?例如停止服务、重新启动或突然终止服务、重新启动等。

也许在所有情况下,它只是意味着关闭和重新启动数据库(或实例?或服务器?),并且根据上下文,可以通过多种方式实现。

oracle sql-server terminology

4
推荐指数
2
解决办法
6057
查看次数

修剪尾随空格、制表符、换行符、回车符等

我正在使用 SQL Server 2008,我正在寻找类似ltrim和的函数rtrim它也将删除前导和尾随制表符、双空格、回车、换行等。

有许多函数,但我发现所有函数都有限制,例如将字符串截断为 8000 个字符。例如(根据一些评论):

SQL SERVER – 2008 – 增强的 TRIM() 函数 – 删除尾随空格、前导空格、空格、制表符、回车符、换行符

其中一个评论提出了一个更好的解决方案,但- 1导致incorrect syntax错误,我不知道为什么。

CREATE FUNCTION dbo.SuperTrimLeft(@str varchar(MAX)) RETURNS varchar(MAX)
    AS
    BEGIN
    IF (ASCII(LEFT(@str, 1)) < 33) BEGIN
        SET @str = STUFF(@str, 1, PATINDEX('%[^'+CHAR(0)+'-'+CHAR(32)+']%', @str) – 1, ' ');
    END;

    RETURN @str;
END;
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,完成上述任务的最佳方法是什么?

sql-server functions

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

如果有行,则仅从存储过程返回记录集

我有一个存储过程,它返回多个记录集以在应用程序中使用。有时,其中一些记录集是空的。

我想减少开销,只返回那些有 1 行或更多行的。

我的问题是 - 我怎样才能只返回那些有行的记录集?

应用程序只需要 0 个或更多记录集,并循环遍历每个记录集,然后将它们打印出来。

我知道我可以在应用程序代码中跳过它们,但我试图阻止它们被返回(如果为空)。

程序很简单:

CREATE PROCEDURE bfsp_PROC_NM
AS 

    BEGIN

        SELECT * FROM TABLE_1

        SELECT * FROM TABLE_2

        SELECT * FROM TABLE_3

        RETURN  

    END
GO
Run Code Online (Sandbox Code Playgroud)

在实际过程中,有些查询的开销很大,所以我不想测试查询,然后如果它返回一行或更多,再次执行它......因为它太昂贵了。

sql-server stored-procedures t-sql sql-server-2014

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