在SQL Server中,如果我执行以下操作:
Difference ('Kennady', 'Kary') : I get 2
Run Code Online (Sandbox Code Playgroud)
如果我做:
Difference ('Kary', 'Kennady') : I get 3.
Run Code Online (Sandbox Code Playgroud)
我认为差异函数会查看引擎盖下的Soundex值,并给出一个0-4的数字,其中有多少个字符是相同的.
SELECT SOUNDEX('Kennady') AS [SoundEx Kennady]
, SOUNDEX('Kary') AS [SoundEx Kary]
, DIFFERENCE ('Kennady', 'Kary') AS [Difference Kennady vs Kary]
, DIFFERENCE ('Kary', 'Kennady') AS [Difference Kary vs Kennady];
Run Code Online (Sandbox Code Playgroud) 我们目前从Visual Studio 2010进行手动构建/发布,我们要求用户始终运行最新版本(在启动前检查和最低要求的版本集).我正在编写部署脚本,并且没有使用msbuild构建/发布的问题.但是,我没有找到一种在msbuild运行时自动增加所需最低版本的方法.我有什么选择在通过msbuild发布时自动将其搞砸?
我确实在这里看到了很多关于这个主题的文章,但它们似乎特定于VS而不是MSBuild.
我有一个过程,其中只要该表中至少存在一行,在应用程序服务器中运行的程序必须访问Oracle数据库服务器中的表.每行数据涉及请求由程序执行某些数字运算的客户端.该程序只能串行执行此数字运算(即,一次对一个客户端而不是并行运行多个客户端).
因此,需要告知程序何时数据库中有数据可供处理.我也可以
问题1:有没有传统观点为什么一种方法可能比另一种方法更好?
问题2:我想知道程序是否有任何问题"一次运行"几个月(服务器中的任何进程是否会停止或破坏程序运行? - 如果是这样我不知道如何学习有一个问题,除非愤怒的客户).任何人都有在服务器上运行程序很长时间没有问题的经验?或者,如果服务器崩溃,有没有办法在服务器重新启动后自动启动它(即C语言可执行文件)程序,因此不需要人专门启动它?
任何建议表示赞赏
更新1:客户端正在等待结果,但是几秒钟的额外延迟(来自轮询)不是交易破坏者.
我们有一个非常大的数据库WriteDB,存储原始交易数据,我们使用此表来快速写入.然后使用sql脚本我将数据导入WriteDB到ReadDB相对相同的表中,但扩展了一些额外的值+关系添加.导入脚本是这样的:
TRUNCATE TABLE [ReadDB].[dbo].[Price]
GO
INSERT INTO [ReadDB].[dbo].[Price]
SELECT a.*, 0 as ValueUSD, 0 as ValueEUR
from [WriteDB].[dbo].[Price] a
JOIN [ReadDB].[dbo].[Companies] b ON a.QuoteId = b.QuoteID
Run Code Online (Sandbox Code Playgroud)
所以最初有大约130万.此表中的行(~50GB).每天他们中的一些人都会添加,其中一些会发生变化,所以现在我们决定不会复杂化逻辑并重新导入所有数据.出于某种原因,由于某种原因,这个脚本的工作时间越来越长,几乎相同数量的数据.首先运行需要~1h,现在已经花了3h
另外SQL Server导入后工作也不顺利.导入(或在其中)如果我尝试运行不同的查询,即使是最简单的,它们通常也会因超时错误而失败.
这种不良行为的原因是什么以及如何解决这个问题?
sql database sql-server sql-server-2008 database-performance
TLDR版本:用于缓存许多在我的.NET4 WCF服务中很少更改的小型数据库表.哪种技术最易于实施,最易于维护,最佳执行以及为什么?
长版:我开始为新项目制定缓存策略.它过去很简单,因为预先打包的选项较少(企业库为初学者),但现在.NET 4框架和AppFabric可用,我很难决定解决方案.基本上,我想缓存大量小的(<100行,2-4列)数据库表,这些表很少更改并让我的WCF服务从缓存中提取而不是每次从数据库中提取.我已经开始阅读文档,观看视频和下载培训材料,但经验是一位更好的老师,我很难找到这两者之间的比较.
任何建议将非常感谢!谢谢!
我的用户可以更新他们的信息,这些信息保存在表格中定义数量的列中,例如:user ( id INT, email VARCHAR, phone VARCHAR, address VARCHAR ).
我见过其他实现,比如Wordpress的实现,它将这些信息存储在一个usermeta用布局调用的表中( umeta_id INT, user_id INT, meta_key VARCHAR, meta_value VARCHAR ).
在我想要实现的更改日志中,我正在评估使用这样的解决方案或制作(我认为会更好),布局如下:userLog ( id INT, date TIMESTAMP, email VARCHAR, phone VARCHAR, address VARCHAR ).
因此,我可以记录任何用户在给定日期所拥有的所有信息.行只会记录更改,在未更改的列上具有NULL.
对于第一个问题:除了能够通过插入适当的方法创建新的信息类型之外,这种布局是否有任何优势meta_key?
我有时认为如果性能在我的环境中是一个问题,这种布局可能不太合适,因为我会使用a VARCHAR来存储我想要存储的每种数据.
对于第二个问题:存储和选择/插入效率真的可以改变我正在考虑的两种解决方案吗?
哪个解决方案应该比其他解决方案更少(或更多)占用空间和/或更少(或更多)选择/插入效率?为什么?
我们最近遇到一个问题,我们的开发团队正在编写的 SQL 包含 SQL Server 2012/2014 中的新功能,并且在2008 兼容性中运行的 SQL Server 2014 允许这样做。
当我在开发服务器上运行它时
EXEC SP_DBCMPTLEVEL '<insert db>'
GO
IF 1=1
THROW 51000, 'values match', 1;
GO
Run Code Online (Sandbox Code Playgroud)
它返回这个
当前兼容级别为 100。
消息 51000,级别 16,状态 1,第 5 行
值匹配
在生产中,相同的 SQL 显示了这一点:
当前兼容级别为 100。
消息 102,级别 15,状态 1,第 5
行“THROW”附近的语法不正确。
我们尚未升级生产 SQL Server,并且遇到了部署问题。THROW 是 SQL Server 2012 中新增的一个关键字,因此我预计 2008 服务器会破坏该语法。对我来说,兼容性级别似乎已经被破坏了。
如何防止不兼容的 SQL 出现在开发环境中?
第1部分
DECLARE @A INT
DECLARE @B NVARCHAR(20)
SET @A=123
SET @B='@A'
Run Code Online (Sandbox Code Playgroud)
第2部分
DECLARE @SQL NVARCHAR(MAX)
SET @SQL='SELECT ' + @B
EXEC SP_EXECUTESQL @SQL
--Should return 123
Run Code Online (Sandbox Code Playgroud)
在非动态SQL中直接引用@A对于此任务是不可接受的。
第2部分中的上述内容通常是我想要做的。我了解该变量超出范围,因此无法像上面那样工作。我如何使用@B来获取@A的值?
更新20190322:我实际上忘记了这个问题,并在C#端而不是在数据库上实现了日志记录,但是如果可能的话,我再次感到好奇。同样,这需要通用,因为我希望将其放在任何存储过程的顶部,并且我不想针对每个sproc对其进行自定义。我在获取参数值的游标中遇到麻烦。这是一个工作示例:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[LoggingTest]
@DateBegin datetime,
@DateEnd datetime,
@Person varchar(8000),
@Unit varchar(8000)
AS
BEGIN
--BEGIN LOGGING CODE
DECLARE @String NVARCHAR(MAX)=''
DECLARE @Parameter_name nvarchar(2000), @type nvarchar(50), @length SMALLINT, @Prec SMALLINT, @Scale SMALLINT, @Param_order SMALLINT, @Collation nvarchar(2000);
DECLARE param_cursor CURSOR FOR
SELECT
'Parameter_name' = name, …Run Code Online (Sandbox Code Playgroud) 我正在尝试制作一个批处理文件,其中列出文件夹和副导演中的所有文件,并导出到具有文件大小的 csv,我目前有这个:
@ECHO OFF &SETLOCAL
(FOR /f "delims=|" %%a IN ('dir /s /b /a-d') DO (
FOR /f "tokens=1-9*" %%x IN ('dir /b /a-d /tc "%%~a"^| C:\Windows\System32\findstr "^[0-9]"') DO (
ECHO %%a, %%z
)
))>DIR.csv
TYPE DIR.csv
Run Code Online (Sandbox Code Playgroud)
但我需要的是文件目录和文件路径作为单独的记录
我有两个表 t1 和 t2,具有相同的列(id,desc)和数据。但其中一列 desc 对于同一主键 id 可能具有不同的数据。
我想从这两个表中选择所有这些行,以便 t1.desc != t2.desc
select a.id, b.desc
FROM (SELECT * FROM t1 AS a
UNION ALL
SELECT * FROM t2 AS b)
WHERE a.desc != b.desc
Run Code Online (Sandbox Code Playgroud)
例如,如果 t1 有 (1,'aaa') 和 (2,'bbb') 并且 t2 有(1,'aaa') 和 (2,'bbb1') 那么新表应该有 (2,'bbb ') 和 (2,'bbb1')
然而,这似乎不起作用。请让我知道哪里出了问题以及正确的方法是什么。
sql-server ×4
sql ×3
database ×2
oracle ×2
t-sql ×2
.net ×1
appfabric ×1
batch-file ×1
caching ×1
clickonce ×1
dynamic ×1
msbuild ×1
mysql ×1
postgresql ×1
wcf ×1