我需要每天从托管的 Web 服务中检索数据集。我可以在 SSIS 包中检索 XML“列名”。但是我需要以csv格式检索数据集中的所有数据或直接带入SQL Server。(行和列、标题数据和数据集)。
这在 SSIS 上可行吗?或者有更好的方法吗?非常感谢任何输入或建议。
假设在数据库中创建了一个证书
create certificate certName
with subject = 'subj';
GO
Run Code Online (Sandbox Code Playgroud)
和映射到此证书的用户
create user userName
from certificate certName;
GO
Run Code Online (Sandbox Code Playgroud)
试图直接冒充此用户
execute as user = 'userName';
GO
Run Code Online (Sandbox Code Playgroud)
或execute as在模块的子句中指定用户
create procedure procName
with execute as 'userName'
as
set nocount on;
GO
Run Code Online (Sandbox Code Playgroud)
返回错误
消息 15517,级别 16,状态 1 ...
无法作为数据库主体执行,因为主体“userName”不存在、无法模拟此类主体或您没有权限。
但是,我找不到文档中提到的这个限制(这里和这里),唯一相关的声明似乎是
user_name 必须存在于当前数据库中并且必须是单例帐户。user_name 不能是组、角色、证书、密钥或内置帐户,例如 NT AUTHORITY\LocalService、NT AUTHORITY\NetworkService 或 NT AUTHORITY\LocalSystem。
是否可以模拟映射到证书的用户(或登录)?
我在支持的 SQL Server 实例上遇到了问题,许多 Stack 站点都提供了有关这些功能的信息,但大多数站点基本上都说“不要使用这些;它们已被弃用/有问题/有漏洞”。我将尝试针对我的特定问题实施变通办法,但我的问题是诸如sp_OACreate和 之类的功能何时sp_OAMethod被弃用?我必须向我的 Sys Admin 和老板解释这一点,以证明重写是合理的,而且我通过谷歌搜索并没有遇到太多(尽管我的搜索词可能很差)。
运行所有这些命令的登录名是sysadminSQL 2012 Developer 实例上服务器角色的成员。它是部署到的数据库的所有者。EXTERNAL ACCESS ASSEMBLY已授予此 DB 中的登录权限。还尝试了以下所有内容作为sa登录无济于事。
alter database test set trustworthy on
go
create assembly [icsharpcode.sharpziplib]
from 'C:\Workspace\111\icsharpcode-SharpZipLib-4f2d664\bin\Release\ICSharpCode.SharpZipLib.dll'
with permission_set = UNSAFE --< This works!
go
create assembly OutOfRowCompression
from 'C:\Workspace\Sandbox\OutOfRowCompression\OutOfRowCompression\bin\Debug\OutOfRowCompression.dll'
with permission_set = UNSAFE --< This fails!
go
Run Code Online (Sandbox Code Playgroud)
最后一个命令失败:
消息 10327,级别 14,状态 1,第 1 行 CREATE ASSEMBLY 为程序集“OutOfRowCompression”失败,因为程序集“OutOfRowCompression”未被授权用于 PERMISSION_SET = UNSAFE。当以下任一情况为真时,程序集被授权:数据库所有者 (DBO) 具有 UNSAFE ASSEMBLY 权限并且数据库具有 TRUSTWORTHY 数据库属性;或者程序集使用证书或非对称密钥签名,该密钥具有具有不安全程序集权限的相应登录名。
收到错误后,我使用新的非对称密钥对程序集进行了签名key1.pfx,并将其添加到主数据库中:
CREATE ASYMMETRIC KEY key1
FROM executable
FILE = 'C:\Workspace\Sandbox\OutOfRowCompression\OutOfRowCompression\bin\Debug\OutOfRowCompression.dll'
Run Code Online (Sandbox Code Playgroud)
验证密钥是否存在: …
想象一下,我正在通过管理工作室运行多个批次,由 GO 命令分隔。我想知道隐式事务的行为方式 - 事务是按批次提交还是在整个执行过程中提交一次。
如果 SQL 服务器中的字符串中存在,我想单独删除行尾的点。
例子:
ABC Private's co., ltd.
Run Code Online (Sandbox Code Playgroud)
所需输出:
ABC Private's co., ltd
Run Code Online (Sandbox Code Playgroud) 我正在尝试建立这个答案如何运行包含许多插入的大型脚本而不会耗尽内存?
而分手的查询与较小的BEGIN TRANSACTION,然后GO的
BEGIN TRANSACTION;
MERGE ghcnd.dbo.us_APCP as target
using
(values
('US1CASN0123','2018-03-22','--N','251'),
('US1KSGO0013','2018-03-22','--N','41'),
('US1WYFM0039','2018-03-22','--N','0'),
('US1SCCF0008','2018-03-22','--N','10'))
as source(cell,[date],valueFlag,[value])
on target.cell = source.cell
AND target.date = source.date
when matched then
update
set valueFlag = source.valueFlag ,
value = source.value
when not matched then
insert (cell,[date],valueFlag,[value])
values (cell,[date],valueFlag,[value])
COMMIT TRANSACTION; GO
Run Code Online (Sandbox Code Playgroud)
但是我收到这个错误
消息 102,级别 15,状态 1,第 3 行 ')' 附近的语法不正确。消息 102,级别 15,状态 1,第 3 行“GO”附近的语法不正确。
正如预期的那样,在“测试”中运行此结果:
SELECT
REPLACE(NCHAR(1234), NCHAR(1234), N'test');
Run Code Online (Sandbox Code Playgroud)
但是,运行此结果会生成“a?a”,其中没有“test”:
SELECT
REPLACE(N'a' + NCHAR(1234) + N'a', NCHAR(1234), N'test');
Run Code Online (Sandbox Code Playgroud)
我认为这可能与 haystack 而不是针的字符串连接有关,但是当我尝试这样做时,它仍然没有“工作”:
SELECT
REPLACE(N'a' + NCHAR(1234) + N'a', N'' + NCHAR(1234) + N'', N'test');
Run Code Online (Sandbox Code Playgroud)
结果:“a?a”
我怀疑这可能与它如何解释字符有关,所以我尝试指定一个二进制排序规则......并“修复”了这个问题:
SELECT
REPLACE(N'a' + NCHAR(1234) + N'a' COLLATE Latin1_General_100_BIN2, NCHAR(1234), N'test');
Run Code Online (Sandbox Code Playgroud)
结果:“atesta”。
为什么?
这种行为似乎对某些角色存在,但对其他角色不存在。
SELECT
REPLACE(N'a' + NCHAR(23423) + N'a', NCHAR(23423), N'test');
Run Code Online (Sandbox Code Playgroud)
结果:“atesta”(“作品”)
SELECT
REPLACE(N'a' + NCHAR(5342) + N'a', NCHAR(5342), N'test');
Run Code Online (Sandbox Code Playgroud)
结果:“a?a”(不“工作”)
为什么?
我有一个使用French_CI_AS排序规则的 SQL Server 法语安装。出于遗留原因,表列将数据存储VARCHAR为稍后转换为正确类型的数据,类似于 C++ 中的变体。
此列中的两行数据如下:
2020-10-12 22:54:40
2020-10-13 04:42:10
Run Code Online (Sandbox Code Playgroud)
DATETIME使用默认选项转换为时,第二个日期失败。该应用程序使用 ODBC 转义序列。SQL 等COLMVALUE >= {ts'2020-01-01 00:00:00'}失败并显示错误:
La Conversion d'un type de données nvarchar en type de données datetime a créé une valeur hors limites
我做了一个DBCC useroptions ,服务器的日期格式设置为dmy. 为什么第 2 行失败?看起来它试图将“13”解释为月份。如果格式是dmy,两个日期不应该都失败吗?
此外,有趣的是,在此服务器上,以下失败:
2020-10-12 22:54:40
2020-10-13 04:42:10
Run Code Online (Sandbox Code Playgroud)
但这有效:
DECLARE @datevar DATETIME = '2020-10-13 04:42:10';
SELECT @datevar;
Run Code Online (Sandbox Code Playgroud)
我知道这DATETIME2比DATETIME. 但是,这里的两者似乎连解析都不一样。
collation type-conversion datetime localization sql-server-2016
sql-server ×9
t-sql ×3
collation ×2
certificate ×1
compression ×1
datetime ×1
functions ×1
import ×1
localization ×1
merge ×1
scripting ×1
security ×1
signature ×1
sql-clr ×1
ssis ×1
transaction ×1
unicode ×1
web-service ×1
xml ×1