SQL Server(特别是 2008 或 2012)CASE语句是评估所有WHEN条件还是在找到WHEN评估为真的子句后退出?如果它确实通过了整个条件集,这是否意味着最后一个条件评估为 true 会覆盖第一个评估为 true 的条件所做的事情?例如:
SELECT
CASE
WHEN 1+1 = 2 THEN'YES'
WHEN 1+1 = 3 THEN 'NO'
WHEN 1+1 = 2 THEN 'NO'
END
Run Code Online (Sandbox Code Playgroud)
结果是“YES”,即使最后一个 when 条件应该使它评估为“NO”。一旦找到第一个 TRUE 条件,它似乎就退出了。有人可以确认是否是这种情况。
当 DOB 字段为空时,以下代码返回 1900-01-01。我想要(并期望)它返回一个空字符串(''),但事实并非如此。我应该如何继续获得我想要的结果?
isnull(convert(date,DOB,1),'')
Run Code Online (Sandbox Code Playgroud) 因此,托管我们的 SQL Server 的公司似乎在从生产服务器到备份服务器的复制方面遇到了一些麻烦……不过我相信有些表已经正确复制了。每天(下班后)进行复制。
有没有办法可以比较 2 个相同的表,1 个来自备份,1 个来自生产服务器,看看昨晚的复制是否有效?
我能找到的唯一方法是在两台服务器上运行以下查询并查看结果是否匹配,这“可能”意味着 2 个表包含相同的信息。
SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*))
FROM (
SELECT *
FROM table_to_compare
) t1
Run Code Online (Sandbox Code Playgroud)
使用上面的代码,似乎该表确实复制成功,因为校验和值相同,但我不确定这种方法有多可靠。
有谁知道更好的方法来检查这个或者这是否是一个好方法?
我在 Windows Server 2008 计算机上运行 SQL Server 2008。
谢谢。
我有一个将 650 个字段插入表中的存储过程。插入失败并出现截断错误。
这是一个简单的
INSERT INTO
SELECT (a bunch of fields)
FROM (a bunch of tables)
Run Code Online (Sandbox Code Playgroud)
下面是错误信息:
消息 8152,级别 16,状态 14,过程 DSP_Procedure,第 1075 行 字符串或二进制数据将被截断。
有没有一种快速的方法可以识别导致截断错误的字段?
要插入表中的 select 语句有 650 个字段,因此很难确定哪个字段导致了截断错误。
我想我可以一次注释掉字段块,以便 SP 一次只插入 100 个字段,然后运行 SP 6 或 7 个不同的时间,直到我至少可以缩小到一组 100 个字段这将包含导致截断错误的字段。
或者,我在想,也许我可以只创建SELECT INTO一个新表,然后将表中的数据长度与我尝试插入到我的 SP 中的目标表的数据长度进行比较,以查看哪个字段包含比预期更长的字段长度。 ..
我正在使用 SQL Server 2014。
有没有更简单的替代品?
我之前使用过完全外部联接来获得我想要的结果,但也许我不完全理解这个概念,因为我无法完成应该是简单的联接。
我有 2 个表(我称之为 t1 和 t2),每个表有 2 个字段:
t1
Policy_Number Premium
101 15
102 7
103 10
108 25
111 3
Run Code Online (Sandbox Code Playgroud)
t2
Policy_Number Loss
101 5
103 9
107 20
Run Code Online (Sandbox Code Playgroud)
我想要做的是从两个表以及 Policy_Number 中获取 Premium 和 Sum of Losses 的总和。我正在使用的代码是:
select sum(premium) Prem_Sum, sum(Loss) Loss_Sum, t1.policynumber
from t1 full outer join t2 on t1.policynumber = t2.policynumber
group by t1.policynumber
Run Code Online (Sandbox Code Playgroud)
上面的代码将返回正确的总和,但它会将在“NULL”policy_number 下没有 policy_number 匹配的所有记录分组。
我希望我的结果看起来像这样
Policy_Number Prem_Sum Loss_Sum
107 NULL 20
111 3 NULL
101 15 5
Run Code Online (Sandbox Code Playgroud)
等等.....
我不想要显示 NULL policy_number …
Excel 中有一个列应该是文本,但 SSIS 在那里看到数字文本并自动使其成为双精度浮点 [DT_R8]。
我可以在输出分支的外部和输出列中手动更改它,但错误输出只是拒绝让我更改相应的列。
Error at Extract Stations [Excel Source [1]]: The data type for "output "Excel Source Error Output" (10)" cannot be modified in the error "output column "Group No" (29)".
Error at Extract Stations [Excel Source [1]]: Failed to set property "DataType" on "output column "Group No" (29)".
Run Code Online (Sandbox Code Playgroud)
我曾尝试修改包 xml。我试过了IMEX=1,typeguessrow=0但没有一个能解决我的问题。这有什么解决办法吗?还有一些文章建议您修改注册表,以便 excel 在猜测数据类型之前读取超过默认的 8 行。我不想走这条路,因为即使它可以工作,我也必须修改我计划运行包的机器上的注册表。
要导入SQL nvarchar字段的excel字段读取例如
295.3
296.33
Run Code Online (Sandbox Code Playgroud)
但它们被写入 SQL 表
295.30000000000001
296.32999999999998
Run Code Online (Sandbox Code Playgroud)
我放入数据查看器,字段显示
295.3
296.33
Run Code Online (Sandbox Code Playgroud)
一直到执行这是正确的,但我猜当它遇到 OLE DB 目标源时,它会以某种方式将它转换为
295.30000000000001
296.32999999999998 …Run Code Online (Sandbox Code Playgroud) 有没有一种方法可以通过单击列(类似于 Excel)来获取查询结果集中列的总和,这样我就不必将该列复制并粘贴到 Excel 中以查看总数列中所有值的总和?
我正在运行 SQL Server 2008。
我正在创建一个包,我将在其中将数据从数据库导出到一个空的 excel 文件中。当我只添加源和目标组件并运行包时,我收到一个转换错误,指出输出列和列“A”无法在 unicode 和非 unicode 字符串数据类型之间转换。
为了解决这个问题,我添加了一个数据转换组件并将所有列转换为
“Unicode 字符串 [DT_WSTR]”
我不再收到错误。唯一的问题是我有大约 50 列,我必须在其中 1 x 1 并从下拉列表中选择“Unicode 字符串 [DT_WSTR]”。然后我必须进入目标组件并将新转换的列映射到我的 excel 文件。
我的问题是,如果其他人遇到过这种情况,是否有更好更有效的方法来避免必须进行所有手动数据类型转换?必须一一转换和映射所有列似乎不切实际,尤其是当您有大量行时。
我知道 excel 文件不是导入和导出数据的最佳方式,但这是在这种特殊情况下所需要的。
我可能会寻找一种仅导出到纯文本文件的方法,然后尝试将其转换为 excel 作为包中的最后一步。我希望这不会触发相同的 unicode/nonunicode 转换错误。
我创建了一个 SSIS 包,它将 Excel 文件导入到 SQL Server 表中。
当我在我的机器上本地运行 SSIS 包时,它运行没有任何问题,但是当我在计划包的服务器上运行它时,我收到以下错误(从我输出错误的文本文件到使用 SSIS 日志记录)。
经过研究,我能找到的唯一建议是将 Run64BitRuntime 属性设置为 false,我做了但仍然没有运气。我怀疑这是导致我错误的原因,因为错误没有指定任何关于 64 位的内容(就像我发现的文章中的情况一样)。
我还认为可能是服务器没有合适的 Excel 驱动程序,但我也不认为是这种情况,因为通常错误消息会说明驱动程序未注册。
我目前无权访问远程服务器。我只能将包上传到一个文件夹,然后它由应用程序运行,因此我能看到的唯一错误消息是我创建的文本错误日志中的内容。
错误代码 DTS_E_CANNOTACQUIRECONNECTIONFROMCONNECTIONMANAGER。对连接管理器“Envision”的 AcquireConnection 方法调用失败,错误代码为 0xC0209303。在此之前可能会发布错误消息,其中包含有关 AcquireConnection 方法调用失败原因的更多信息。
“Envision”是我的 excel 连接管理器的名称。
我使用表达式填充 Excel 文件路径和连接字符串。
连接字符串表达式如下所示:
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+@[User::SourceFilePath] +";Extended Properties=\"EXCEL 12.0 XML;HDR=YES\";"
SSIS 包由 Windows 用户名/帐户执行。我认为这可能是一个网络服务帐户。(BDS_sprtIIS)
有没有人对如何解决仅在我的本地计算机上运行但在将部署包的实际服务器上不起作用的包的这个问题有任何解决方案或建议?
我在另一个论坛上找到了以下答案,请问是什么导致了我的问题?他们基本上是说 Excel 连接管理器出于某种原因尝试访问用户临时文件夹,如果它无权访问该文件夹,则它将失败:
我也注意到 Microsoft.JET.OLEDB.4.0 驱动程序将尝试读取登录用户配置文件下的临时目录。
.
...我们使用较低级别的域帐户运行我们的 SQL 代理,并使用代理帐户运行我们的 SSIS 包。你是对的,因为 Procmon 也为我证实了这一点。我将代理帐户权限授予了配置文件的临时目录 (C:\Documents and Settings\SQLAgentDomainAccount\Local Settings\Temp) 并且它起作用了!
我没有使用 SQL Server 作业或代理帐户。该包由 Windows 帐户很可能通过命令行脚本简单地执行。
Windows 帐户可以访问该文件,但我不确定它是否可以访问它的“TEMP”文件夹(我从未在包中引用它,所以我不知道为什么它需要访问该文件夹) ...
如果我说:
Table1 left join Table2
Run Code Online (Sandbox Code Playgroud)
和说一样吗?:
Table2 right join Table1
Run Code Online (Sandbox Code Playgroud)
换句话说,我是否应该期望从 2 个相同的查询中获得相同的结果,其中唯一改变的是首先写入哪个表以及是使用左连接还是右连接(遵循我上面描述的相同模式?)