为什么T-SQL中的PRINT语句似乎有时只能工作?使用它有哪些限制?似乎有时候如果生成了一个结果集,它就变成了一个空函数,我假设它可以防止破坏结果集,但是它的输出是不是可以在另一个结果集中输出,比如行计数?
我正在尝试使用更新查询在SQL Server中翻转一个字段,也就是说,我想将所有0都变为1,反之亦然.什么是最优雅的解决方案?
在T-SQL中似乎没有按位NOT运算符(除非我遗漏了一些明显的东西)并且我无法找到执行更新的任何其他方法.
根据这个论坛的讨论,SQL Server(我使用2005但我收集这个也适用于2000和2008)默认将varchar你指定的任何s指定为varchar的长度,即使直接插入该字符串也是如此.INSERT实际上会导致错误.例如.如果我创建此表:
CREATE TABLE testTable(
[testStringField] [nvarchar](5) NOT NULL
)
Run Code Online (Sandbox Code Playgroud)
然后当我执行以下内容时:
INSERT INTO testTable(testStringField) VALUES(N'string which is too long')
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:
String or binary data would be truncated.
The statement has been terminated.
Run Code Online (Sandbox Code Playgroud)
大.保留了数据完整性,并且调用者知道它.现在让我们定义一个存储过程来插入:
CREATE PROCEDURE spTestTableInsert
@testStringField [nvarchar](5)
AS
INSERT INTO testTable(testStringField) VALUES(@testStringField)
GO
Run Code Online (Sandbox Code Playgroud)
并执行它:
EXEC spTestTableInsert @testStringField = N'string which is too long'
Run Code Online (Sandbox Code Playgroud)
没有错误,1排受影响.将一行插入表中,testStringField格式为'strin'.SQL Server以静默方式截断存储过程的varchar参数.
现在,这种行为有时可能很方便,但我认为没有办法把它关掉.这非常烦人,因为如果我将一个字符串传递给存储过程,我希望错误.似乎有两种方法可以解决这个问题.
首先,将存储过程的@testStringField参数声明为大小为6,并检查其长度是否超过5.这看起来像是一个黑客攻击并涉及大量的样板代码.
其次,只需声明所有存储过程varchar参数varchar(max),然后让INSERT存储过程中的语句失败.
后者似乎工作正常,所以我的问题是:varchar(max)在SQL …
为了开始这个,我很清楚参数化查询是最好的选择,但我想知道是什么让我在下面提出的策略容易受到攻击.人们坚持认为下面的解决方案不起作用,所以我找一个为什么它不会这样做的例子.
如果在发送到SQL Server之前使用以下转义在代码中构建动态SQL,那么什么样的注入可以打败这个?
string userInput= "N'" + userInput.Replace("'", "''") + "'"
Run Code Online (Sandbox Code Playgroud)
在SQL Server中无法使用"\"转义单引号.
我相信使用Unicode进行SQL走私(此处概述)会被生成的字符串被单引号前面的N标记为Unicode这一事实所阻碍.据我所知,SQL Server没有其他字符集会自动转换为单引号.没有未转义的单引号,我不相信注射是可能的.
我不相信String Truncation也是一个可行的载体.SQL Server肯定不会截断,因为根据microsoft,a的最大大小为nvarchar2GB .在大多数情况下,2 GB的字符串是不可行的,在我的情况下是不可能的.
二阶注入是可能的,但如果可能的话:
我并不是说这比使用参数化查询更好或者替代,但我想知道我概述的内容是如何易受攻击的.有任何想法吗?
我有一张日期表,所有日期都发生在11月.我写了这个查询
select id,numbers_from,created_date,amount_numbers,SMS_text
from Test_Table
where
created_date <= '2013-04-12'
Run Code Online (Sandbox Code Playgroud)
此查询应返回第11个月(11月)发生的所有事件,因为它发生在 "2013-04-12"日期之前(12月)
但它只返回在小于04(2013- 04 -12)的日子里发生的可用日期
可能只是比较一天的部分吗?而不是整个约会?
如何解决这个问题?
Created_date的类型为date
日期格式默认为yyyy-dd-MM
将Visual Studio 2015 Update 2中的SQLServer项目与数据库SQL Server 2012进行比较时,更改方向时会显示错误"目标不可用"或"源不可用".
它曾经在几个月前正常工作.有没有解决方法?我找不到任何东西.
运行此代码时,SQL Server Management Studio会抛出一个错误:
declare @percentage numeric(3,2)
set @percentage = cast(15 as numeric(3,2))
Run Code Online (Sandbox Code Playgroud)
但当我将数字声明更改为
declare @percentage numeric(4,2)
set @percentage = cast(15 as numeric(4,2))
Run Code Online (Sandbox Code Playgroud)
一切顺利.
数字数据类型是否有限制?
如何为SQL Server Management Studio 2008的查询编辑器启用自动换行?
我有一个查询,我在SQL Server Management Studio中运行(连接到SQL Server 2005数据库).我想以CSV格式导出数据.不想要CSV格式,你只需在每一列之间加一个逗号,但是"真正的"CSV格式,你可以在字符串中加上引号.这样,您可以导出包含逗号或引号的数据.
我看到的所有例子都局限于想要的格式.我无法弄清楚引用字符串的选项在哪里.
如果SSMS真的无法实现这一基本功能,那么还有其他工具可以轻松完成吗?每次我需要数据转储时,我都不想编写C#程序.
我知道如何在SSMS中使用以下SQL获取最后执行的查询 -
SELECT deqs.last_execution_time AS [Time], dest.text AS [Query]
FROM sys.dm_exec_query_stats AS deqs
CROSS APPLY sys.dm_exec_sql_text(deqs.sql_handle) AS dest
ORDER BY deqs.last_execution_time DESC
Run Code Online (Sandbox Code Playgroud)
但我想找到一个特定的数据库.如果我不需要,我不想使用SQL事件探查器.另外,我不认为SQL Profiler会允许我查看已经运行但未启用分析的查询.我需要从SSMS做到这一点.
sql-server ×10
sql ×3
t-sql ×3
ssms ×2
compare ×1
csv ×1
date ×1
editor ×1
numeric ×1
sanitization ×1
security ×1
truncate ×1
truncation ×1
types ×1
variables ×1