我正在对sqlserver进行BULK INSERT,并且没有正确地将UTF-8字符插入数据库.数据文件包含这些字符,但在批量插入执行后数据库行包含垃圾字符.
我的第一个疑问是格式文件的最后一行:
10.0
3
1 SQLCHAR 0 0 "{|}" 1 INSTANCEID ""
2 SQLCHAR 0 0 "{|}" 2 PROPERTYID ""
3 SQLCHAR 0 0 "[|]" 3 CONTENTTEXT "SQL_Latin1_General_CP1_CI_AS"
Run Code Online (Sandbox Code Playgroud)
但是,在阅读这个官方页面后,在我看来,这实际上是SQL Server 2008版中的插入操作读取数据文件时的一个错误.我们使用的是版本2008 R2.
这个问题的解决方案是什么,或者至少是一种解决方法?
我一直在ReportingServices.js使用Firefox和Firebug 调试该文件.我发现SSRS(SQL Server Reporting Services)报表管理器(报表的Web前端)在Firefox(v7.0.1)中不起作用的原因是它javascript .lastChild用于查找元素.不幸的是,Firefox也会将空白作为TextNode元素,因为元素选择无法按预期工作.
这适用于IE,希望有人知道解决方案.我编辑了javascript以解决一个错误,但后来又打了一个更复杂的错误,所以可能是一个我的字段试图手动修复.希望有一些更新或补丁可用.
这是在Windows 2008 R2 Datacenter服务器上运行SQL Server 2008 R2标准版.
如果您觉得这不是这样一个问题的论坛,请道歉.在这种情况下,如果不合适,请建议我在哪里提出问题.它有点javascript问题,但可能有软件更新解决方案.
更新:
经过几个小时的修复文件中的浏览器兼容性错误后,ReportingServices.js我设法让它在Firefox,Chrome,Opera和Safari以及IE上运行.对不起,我的答案分为两部分; 我发布ReportingServices.js了解决方案更新的完整代码.
javascript reportmanager sql-server-2008-r2 reporting-services ssrs-2008
我有3个表:audioFormats,videoFormats和fileInfo.我有一个事务,当我插入fileInfo表时,该插入包括来自audioFormats和videoFormats的FK.如果音频格式或视频格式不在这些表中,则插入到后面的表中,然后将生成的(或现有的)ID值插入到fileInfo中.
如何仅在该值不存在时才有效地插入值,但是获取值的ID是否已经存在或仅使用SQL(可能是事务)重新插入.
我可以插入一个值,如果它尚不存在:
INSERT INTO audioformats (audioformat)
VALUES(@format)
WHERE NOT EXISTS (SELECT 1 FROM audioformats WHERE audioformat = @format)
Run Code Online (Sandbox Code Playgroud)
我可以从插入中获取插入的ID:
INSERT INTO audioFormats (audioFormat)
VALUES ('Test')
SET @audioFormatId = SCOPE_IDENTITY()
Run Code Online (Sandbox Code Playgroud)
如果没有插入,SCOPE_IDENTITY将不会给我ID值.我可以执行标量查询以在可能的插入后获取标识,但似乎我应该能够使用最多一个SELECT和INSERT完成所有这些操作.
我正在尝试开发邮件触发器.有人可以协助如何实现这一点,以便当用户插入记录时,它会检查"速度"字段,以便当插入的值超过100时,将邮件发送到指定的地址.
雅各布问了一个完美的问题:给我MERGE语法.
那里的每一个答案都会立即跳到他们能想到的最复杂的案例中; 用无关的混淆来掩盖语法.
马克给出了答案:
MERGE
member_topic AS target
USING
someOtherTable AS source
ON
target.mt_member = source.mt_member
AND source.mt_member = 0
AND source.mt_topic = 110
WHEN MATCHED THEN
UPDATE SET mt_notes = 'test'
WHEN NOT MATCHED THEN
INSERT (mt_member, mt_topic, mt_notes) VALUES (0, 110, 'test')
;
Run Code Online (Sandbox Code Playgroud)
看着这个答案,我和雅各布一样困惑:
我没有someOtherTable
Marc建议这someOtherTable是一个虚拟的占位符值 - 没有那个表并不重要.
我尝试了,SQL Server 确实抱怨
无效的对象名称'someOtherTable'.
这使我努力理解什么USING的USING foo是对,如果它不是重要的(除了实际上很重要).
是什么USING时,它的使用使用富时我使用SQL Server 2008合并语法?
什么是使用MERGE的UPSERT语法: …
编辑:我已经更新了示例代码并提供了完整的表和视图实现以供参考,但基本问题仍未改变.
我在数据库中有一个相当复杂的视图,我试图查询.当我尝试通过将WHERE子句硬编码为特定外键值从视图中检索一组行时,视图执行速度非常快,并且具有最佳执行计划(正确使用索引等)
SELECT *
FROM dbo.ViewOnBaseTable
WHERE ForeignKeyCol = 20
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试向查询添加参数时,我的执行计划突然崩溃了.当我运行下面的查询时,我正在获取索引扫描而不是遍布整个地方并且查询性能非常差.
DECLARE @ForeignKeyCol int = 20
SELECT *
FROM dbo.ViewOnBaseTable
WHERE ForeignKeyCol = @ForeignKeyCol
Run Code Online (Sandbox Code Playgroud)
我正在使用SQL Server 2008 R2.什么给这里?使用导致次优计划的参数有什么用?任何帮助将不胜感激.
作为参考,这里是我得到错误的对象定义.
CREATE TABLE [dbo].[BaseTable]
(
[PrimaryKeyCol] [uniqueidentifier] PRIMARY KEY,
[ForeignKeyCol] [int] NULL,
[DataCol] [binary](1000) NOT NULL
)
CREATE NONCLUSTERED INDEX [IX_BaseTable_ForeignKeyCol] ON [dbo].[BaseTable]
(
[ForeignKeyCol] ASC
)
CREATE VIEW [dbo].[ViewOnBaseTable]
AS
SELECT
PrimaryKeyCol,
ForeignKeyCol,
DENSE_RANK() OVER (PARTITION BY ForeignKeyCol ORDER BY PrimaryKeyCol) AS ForeignKeyRank,
DataCol
FROM
dbo.BaseTable
Run Code Online (Sandbox Code Playgroud)
我确定窗口函数是问题,但我通过窗口函数分区的单个值过滤我的查询,所以我希望优化器先过滤然后运行窗口函数.它在硬编码示例中执行此操作,但不是参数化示例.以下是两个查询计划.最佳计划是好的,底层计划是坏的.

它说,SQL Server 2008 R2 Management Studio无法识别下面的例子
Throw附近的语法错误
我试图在这里抛出一个错误,所以当有人插入两次相同的值时,我可以在我的网站上处理它.
Begin Try
insert into BusinessID (BusinessID) values (@ID)
insert into BusinessID (BusinessID) values (@ID)
End Try
Begin Catch
Print 'PK already exist'
THROW
End Catch
Run Code Online (Sandbox Code Playgroud) 我在SQL Server 2008 R2中有一个数据库,我想将这个数据库复制到另一台机器上.
我该如何制作副本?
我该如何恢复它?
谢谢
在开发过程中遇到了相当奇怪的SQL Server行为.在这里,绝对相同的数字我们有完全相同的公式.唯一的区别是我们如何得到这个数字(4.250).从表,临时表,变量表或硬编码值.在所有情况下,圆角和铸造都是完全相同的.
-- normal table
CREATE TABLE [dbo].[value]
(
[val] [decimal] (5, 3) NOT NULL
)
INSERT INTO [value] VALUES (4.250 )
SELECT ROUND(CAST(val * 0.01 / 12 AS DECIMAL(15, 9)), 9) AS val FROM [value] AS pr
-- inline query from normal table
SELECT * FROM (SELECT ROUND(CAST(val * 0.01 / 12 AS DECIMAL(15, 9)), 9) AS val FROM [value] AS pr) a
-- record without table
SELECT ROUND(CAST(4.250 * 0.01 / 12 AS DECIMAL(15, 9)), 9) AS val …Run Code Online (Sandbox Code Playgroud) sql sql-server sql-server-2008-r2 sql-server-2014 sql-server-2016
我正在使用以下T-SQL从我的SQL Server 2008 R2数据库中获取角色成员:
select rp.name as database_role, mp.name as database_user
from sys.database_role_members drm
join sys.database_principals rp on (drm.role_principal_id = rp.principal_id)
join sys.database_principals mp on (drm.member_principal_id = mp.principal_id)
order by rp.name
Run Code Online (Sandbox Code Playgroud)
当我检查输出时,我注意到列出的唯一角色成员db_datareader是db角色 - db_datareader查询中没有列出任何用户成员.
这是为什么?我怎样才能列出我的数据库角色的用户成员?
我想我也应该问一下这个表是否sys.database_role_members真的包含了一个角色的所有成员?
sql-server ×6
sql ×5
bulkinsert ×1
email ×1
javascript ×1
merge ×1
ssrs-2008 ×1
t-sql ×1
throw ×1
triggers ×1
try-catch ×1
upsert ×1
utf-8 ×1