我正在开发一个需要 SQL Server 的软件。但是对于一个 50MB 的应用程序来说,告诉客户安装 SQL Server 并不是一个好主意。所以我认为最好使用 SQL Server Express LocalDB。
我想提供从局域网访问我的应用程序的功能。但我没有得到任何相关的主题来做到这一点。
是否可以在局域网上访问 SQL Server Express LocalDB?
与 SQL Server 相比,SQL Server Express LocalDB 有哪些限制?
我正在开发一个需要 SQL Server 的软件。但是对于一个 50MB 的应用程序来说,告诉客户安装 SQL Server 并不是一个好主意。所以我认为最好使用 SQL Server Express LocalDB。
我想提供从局域网访问我的应用程序的功能。但我没有得到任何相关的主题来做到这一点。
是否可以在局域网上访问 SQL Server Express LocalDB?
与 SQL Server 相比,SQL Server Express LocalDB 有哪些限制?
我有一个带有 XML 列的数据库。我正在尝试更新(修剪)xml 列的 xml 值。我在 Windows、SQL Server 2008 Express 上运行。
我没有找到任何直接在 Xquery 中修剪的方法,所以我尝试选择值。这是SQL
select RTRIM(LTRIM(col2.value('(/Root/Row/Rowid/text())[1]','varchar(20)')))
from dbo.T1
但现在我不知道如何更新这个 xml 值。
有没有办法直接修剪 xml 值?如果不是,我该如何修剪价值?
我不是要更新表中的单行,而是要修剪表中所有行的 xml 值
在我们的应用程序中,我们计划使用带有 OLE DB 的 SQL Server CE 4.0。连接字符串如下所示。
Dim strConn As String = "Provider=Microsoft.SQLSERVER.CE.OLEDB.4.0;Data Source=\\pc137\d\desktop\mydb.sdf; SSCE:Database Password='password';"
Dim conn As New OleDbConnection
conn = New OleDbConnection(strConn)
conn.Open()
这个适用于本地和网络共享文件 ( .sdf
)
我们尝试使用 Visual Studio 连接网络共享,但出现以下错误
SQL Server Compact 不支持在网络共享上打开数据库文件。
那么是否允许在网络共享中使用 OLE DB 连接 SQL Server CE 4.0?
它会导致任何其他问题吗?
我对SET DATEFORMAT命令有一些疑问。
1)此命令是否仅用于插入和更新日期格式,不影响该列的日期格式?或者在插入值后这是否会影响我的表格?
2)我尝试使用以下命令(用于日期数据类型)并得到类似的错误This session's YDM date format is not supported when converting from this character string format to date, time, datetime2 or datetimeoffset. Change the session's date format or provide a style to the explicit conversion.
。为什么日期数据类型出现错误(对于 smalldatetime,它的工作原理如链接所示)?
CREATE TABLE #tempTable (DateFormatSample DATE)
SET DATEFORMAT MDY
INSERT INTO #tempTable
VALUES ('09/28/2007')
SET DATEFORMAT YDM
INSERT INTO #tempTable
VALUES ('2007/28/09')
SET DATEFORMAT YMD
INSERT INTO #tempTable
VALUES ('2007/08/28')
SELECT DateFormatSample
FROM #tempTable
DROP TABLE #tempTable
3)有人提到“SET DATEFORMAT 的设置是在执行或运行时设置的,而不是在解析时设置的。” 这是什么意思?
我只想获取具有值NULL
和其他值的行,而不是NULL
特定用户名列。
如果该特定用户名的两行都为 null,或者两者都具有 null 以外的其他值,则它不应出现在输出中。如果相同的用户名有两行以上,并且具有 null 和其他一些值,那么它们应该出现。
下面是示例示例和输出。如何使用 sql 查询来完成?
+----------+-------+
| username | col2 |
+----------+-------+
| a | abc |
| a | ef |
| b | null |
| b | null |
| c | der |
| c | null |
+----------+-------+
输出
+----------+------+
| username | col2 |
+----------+------+
| c | der |
| c | null |
+----------+------+
我可以使用转换等将时间数据类型转换为 12 小时格式。但是是否有任何选项可以使用任何设置或属性或任何其他方法在 SQL 表中以 12 小时格式保存时间?
在我的一个应用程序中,我们有如下所示的 tsql
SELECT DISTINCT [Dblist].[DbName] AS [DbName]
FROM [Common].dbo.[Dblist]
WHERE dbname not in (
SELECT [name]
FROM master.dbo.sysdatabases )
对于我的一位客户,它给出了与排序规则相关的错误,因为数据库Common
(我的应用程序的一部分)具有默认排序规则sql_latin1_general_cp1_ci_as
,而主数据库具有排序规则latin1_general_ci_as
。我找到了一个使用 collate 的解决方案并且它有效。我希望解决方案适用于所有排序规则。
SELECT DISTINCT [Dblist].[DbName] AS [DbName]
FROM [Common].dbo.[Dblist]
WHERE dbname not in (
SELECT [name] COLLATE DATABASE_DEFAULT
FROM master.dbo.sysdatabases )
现在我很困惑。我应该在涉及系统数据库的所有查询中使用 COLLATE 吗?什么时候使用collate,什么时候不使用?
此外,上述使用整理的方式是否正确(如 COLLATE DATABASE_DEFAULT)?这里 DATABASE_DEFAULT 是 latin1_general_ci_as 本身,因为它是主数据库的排序规则。那么解决方案是如何工作的,因为它们再次与通用数据库不匹配?我想要适用于所有排序规则的解决方案。
在 SQL Server 中,如果我们尝试更改具有索引的列的数据类型,那么它会删除与该列关联的索引并更改数据类型。我不知道它并且面临索引被删除的问题所以我想知道是否有任何数据库更改事件(SQL 命令)会导致删除索引。
我正在使用 SQL Server 链接服务器,在运行查询时发现了一些困难。
以下是实际查询。
USe testdb
SELECT 'Identitiy property OFF' where COLUMNPROPERTY( OBJECT_ID('Table_1'),'column1','IsIdentity')=0
要将它运行到我使用的链接服务器
Use mylinkedserver.testdb
SELECT 'Identitiy property OFF' where COLUMNPROPERTY( OBJECT_ID('Table_1'),'column1','IsIdentity')=0
但是当我运行它时,我得到如下所示的错误数据库'mylinkedserver'不存在。确保输入的名称正确。
我可以在哪里select * from pc91sql.testdb.dbo.Table_1
成功使用查询表。
那么如何运行上述查询?(我认为我不能将“USE”与链接服务器一起使用。那么有什么替代方法
编辑:
这些事情我在得到很好的答复后尝试过。然后我使用了 OPENQUERY 选项
SELECT * FROM OPENQUERY(pc91sql,'SELECT COLUMNPROPERTY( OBJECT_ID(''testdb.dbo.Table_1''),''column1'',''IsIdentity'')');
它返回 NULL。但它应该返回 1,因为 column1 是一个标识列。
然后我再次检查直接在链接服务器中运行我的原始查询而不使用命令并返回 NULL。如果我在提到之后use testdb
或在从列表中选择数据库后在 SSMS 中运行相同的查询,那么它会返回 1 。所以这意味着OBJECT_ID
不能将数据库名称与表名称一起使用(即像“testdb.dbo.Table_1”)。
我正在使用 sql server 的 EncryptByPassPhrase。但我无法正确使用 where 条件。
DECLARE @login_details TABLE(uid integer,username varchar(10),password varbinary(100))
insert into @login_details(uid,username,password) values(1,'abc',EncryptByPassPhrase('12','XXX'))
insert into @login_details(uid,username,password) values(1,'nvt',EncryptByPassPhrase('12','YYY'))
select * from @login_details --this give all rows from table with encrypted values--
select uid,username,convert(varchar(10), DECRYPTBYPASSPHRASE ('12',password)) as password from @login_details --this gives decrypted values
但是在下面的查询中,我使用了 where 条件,但它不起作用并导致 0 行。为什么?
select uid,username,convert(varchar(10), DECRYPTBYPASSPHRASE ('12',password)) as password from @login_details
where password=EncryptByPassPhrase('12','YYY')
如下查询工作正常。
select uid,username,convert(varchar(10), DECRYPTBYPASSPHRASE ('12',password)) as password from @login_details
where convert(varchar(10), DECRYPTBYPASSPHRASE ('12',password))='YYY'
如果我在 where 条件中包含 encryptbyphrase 命令,为什么会出现问题?
我正在使用 SQL Server Express 2008 R2。新创建的数据库的自动关闭属性将设置为与模型 db 相同的值。在我的例子中,我已经将模型的 autoclose 设置为 false,这样当我创建一个新数据库时,它也会将 autoclose 设置为 false。
如果我将自动关闭设置为 false 的数据库分离然后附加它,则自动关闭设置为 true。我期待 autoclose 是假的,因为它会从模型数据库继承它的属性。在我的情况下,分离和附加数据库会导致 autoclose 属性设置为 true。
为什么会这样?这个问题有什么解决办法吗?
我已经问过一些关于自动增长和收缩的问题。但我对此有一些疑问。
我有一个每月增长约 300 MB 的数据库。那么最好将其设置为 300 MB 的 Autogrowth 吗?现在设置了 10 MB。
我有很多小型数据库,其中的数据确实约为 50 MB。但它的物理大小约为 900 MB。(所以 850 是可用空间)。我没有缩小这个数据库。好像当数据被添加自动增长时我再次缩小它。但是很少向这个数据库添加数据。所以我认为未来一年它不会增长超过 200MB。
那么我应该缩小数据库吗?如果我保持原样?这会导致任何性能问题吗?或者数据库中有更多的可用空间(超过 90%)会导致任何问题?我认为大多数人认为物理尺寸大会导致性能问题。这是真的还是假的?
SQL Server 2008 R2 Express 数据库大小限制为 10 GB。那么它是mdf和ldf文件的物理大小吗?因为如果我应该在任何时候缩小数据库,我需要考虑这一点。
在 SQL Server 中,每个数据库都有一个属性Initial Size (MB),可以在 SSMS 中的数据库属性中看到。默认情况下,mdf 为 3 MB,ldf 文件为 1 MB。
所以现在如果创建一个新数据库,那么它将被设置为默认大小(即 mdf 为 3 MB,ldf 文件为 1 mb)。但是在创建数据库后,我将初始大小更改为其他值,例如对于 mdf 10 MB 和 ldf 5 MB。(实时某些数据库管理员可能希望在创建数据库后更改初始值)
但是现在如果缩小数据库,它将缩小到我在创建后设置的初始大小之外(考虑数据库中没有数据,否则它将缩小到其实际内容大小)。它将缩小到创建数据库期间的初始大小(即 mdf 为 3mb,ldf 为 1mb)。我希望缩小到我设置的初始大小(即 mdf 为 10 mb,ldf 为 5mb)。有可能做到吗?如果可能,那怎么办?
在某些文章中,我看到 dbcc SHRINKFILE 可用于缩小超出初始大小,而 dbcc SHRINKDATABASE 不能缩小超出初始大小。但我只想缩小到我设置的初始大小。
注意:我知道收缩是不好的,不应该做。但我想知道怎么做?如果 sql server 只考虑创建数据库时设置的初始大小,那么在创建数据库后设置初始大小有什么用?
编辑:
来自微软收缩相关文章:使用 DBCC SHRINKDATABASE 您不能将数据库收缩到其初始大小以下。
我的问题是我可以更改现有数据库本身的初始大小吗?
编辑:
我有大约 5 个 sql server 实例。所有创建的数据库默认大小为 3 mb 的数据和 1 mb 的日志(大约 3 年前)。现在所有的数据库都在 100-1000 mb 的范围内。我不会正常收缩数据库,因为这不是一个好习惯。但是一些数据库增长超过 10 GB(mdf 文件本身,因为我在其中插入了这么多数据)。因此,当数据库很大时,我会将不重要的旧内容从该数据库转移到另一台服务器,因为该服务器不需要我。因此,数据库大小从 10 GB 减少到 1 GB。现在剩余的 9 Gb 未使用。现在我想指定数据库大小减少到 2 GB,这样我将获得 1 GB 可用空间(2 Gb 也是这个数据库的理想大小),这可用于避免自动增长,直到下一个 1 Gb 数据被填充. 我还为这种具有更多写入的大型数据库设置了 100 MB 的自动增长。因此,与其在 shrinkfile 命令中将大小指定为 2 GB,不如将初始大小更改为 2 GB(shrink 考虑),那么它会更好。在这个数据库创建期间,没有关于大小、autogroth 等的计划。因为它是在大约 3 年前创建的。现在我打算设置自动增长等。我不能再次使用新的初始大小和移位数据创建新数据库。所以我问我是否可以更改现有数据库的初始大小?因为它是大约 3 年前创建的。现在我打算设置自动增长等。我不能再次使用新的初始大小和移位数据创建新数据库。所以我问我是否可以更改现有数据库的初始大小?因为它是大约 3 年前创建的。现在我打算设置自动增长等。我不能再次使用新的初始大小和移位数据创建新数据库。所以我问我是否可以更改现有数据库的初始大小?
在 SQL Server 浮点数据类型中,小数点后不显示尾随零
declare @num as float
set @num=5.20
select @num
只会显示5.2
但我希望它显示为5.20
经过一番研究,我发现它可以通过使用来解决
select CAST(@num AS numeric(10,2))
但这不是我期待的解决方案。有没有像设置数据类型或更改数据类型这样的方法,以便我可以实现相同的目标?(如果浮点数中有任何变体可以做同样的事情会更好)
如果可能的话,我不需要更改 SQL 语句并包含演员表等。所以请帮助我。
如果 SQL Server 数据库用户仅具有特定数据库的public
权限和权限,那么在 SSMS 中尝试选项时,生成的脚本将不正确。server roles
db_datareader
public
script index as CREATE To
我的意思是,如果索引具有过滤条件,则不会显示该过滤条件
所以对于拥有所有者权限的用户script index as CREATE To
将显示
USE [test]
GO
/****** Object: Index [filtered] Script Date: 12/30/2013 18:54:19 ******/
CREATE NONCLUSTERED INDEX [filtered] ON [dbo].[Table_1]
(
[b] ASC
)
WHERE ([Table_1].[b] IS NULL)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
对于只有db_datareader
权限的用户script index as CREATE To
将显示
USE [test]
GO
/****** Object: Index [filtered] Script Date: 12/30/2013 18:55:13 ******/
CREATE NONCLUSTERED INDEX [filtered] ON [dbo].[Table_1]
(
[b] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
如果db_datareader
不允许用户查看索引脚本并显示访问被拒绝错误,那也没关系。但它显示无效的脚本。此外,如果选中索引属性,则仅不显示过滤条件,并显示索引的其他属性。为什么会这样?
我可以Scope_Identity()
用来获取插入到标识列中的最后一个标识值。但是如何获取插入语句中插入的所有行的标识值?
例子
insert into DestinationTbl select * from SourceTbl where [col1]='xyz'
上面的语句可能会在一个表中插入多行。所以我想要插入的所有行的标识值。怎么做?
我之前曾问过关于带有不区分大小写标签的 XML 查询的问题,我也找到了解决方案。但我也找到了一些其他的解决方案。所以桌子就像
DECLARE @myTable TABLE ( yourXML XML )
INSERT INTO @myTable SELECT '<z><a><b>1</b><c>2</c></a></z>'
INSERT INTO @myTable SELECT '<Z><A><b>1</b><c>2</c></A></Z>'
以下所有解决方案都返回我想要的(不区分大小写的标签)
-----Solution 1----------
SELECT * FROM @myTable WHERE ( [yourXML].exist('for $x in /*[lower-case(local-name(.)) = "z"]/*[lower-case(local-name(.)) = "a"] where ( ($x/*[lower-case(local-name(.)) = "b"][1]) = 1 ) return $x')>0 )
-------------------------
-----Solution 2----------
SELECT * FROM @myTable
WHERE
(CONVERT(XML,LOWER(CONVERT(VARCHAR(MAX),[yourXML]))).exist('for $x in /z/a where ( ($x/b[1]) = 1 ) return $x')>0 )
-------------------------
-----Solution 3----------
SELECT * FROM @myTable WHERE
([yourXML].exist('for $x in (/Z/A,/z/a) where ( ($x/b[1],$x/B[1]) = 1 ) return $x') > 0 )
-------------------------
现在我想通过考虑它的所有 X 查询命令(支持 value()、exist()、count()、query() 等)、性能、效率等来知道哪个更好用。
我有一个要求,我希望 XML 标记在我的 xml 查询中不区分大小写。
例如:
DECLARE @myTable TABLE ( yourXML XML )
INSERT INTO @myTable SELECT '<z><a><b>1</b><c>2</c></a></z>'
INSERT INTO @myTable SELECT '<Z><A><b>1</b><c>2</c></A></Z>'
SELECT * FROM @myTable WHERE ( [yourXML].exist('for $x in /z/a where ( ($x/b[1]) = 1 ) return $x')>0 )
返回输出为
yourXML
<z><a><b>1</b><c>2</c></a></z>
但我希望在不考虑 XML 标记大小写的情况下显示输出。所以我想要的输出应该是
yourXML
<z><a><b>1</b><c>2</c></a></z>
<Z><A><b>1</b><c>2</c></A></Z>
怎么做?
在 SSMS 中创建表,如果我们在列名中包含 sql 关键字,那么它会自动用方括号“[]”括起来,并且通常会在没有任何错误的情况下创建表。
但是如果我们包含一些关键字,例如 merge 那么 SSMS 将不会在它周围插入方括号并且在保存表错误时显示为
'Table_2' table
- Unable to create table.
Incorrect syntax near the keyword 'MERGE'.
Incorrect syntax near the keyword 'NULL'.
当我在 master 数据库上运行 dbcc checkdb 时,出现如下错误
Msg 5030, Level 16, State 12, Line 1
The database could not be exclusively locked to perform the operation.
Msg 7926, Level 16, State 1, Line 1
Check statement aborted. The database could not be checked as a database snapshot could not be created and the database or table could not be locked. See Books Online for details of when this behavior is expected and what workarounds exist. Also see previous errors for more details.
当我搜索它时,我得到了很多链接,说明它发生在数据库具有只读文件组或文件位于 FAT32 文件系统中时。但是当我检查主数据库不在只读文件组中时。但是 mdf 文件是在 FAT32 文件系统中。所以解决方案是将 TABLOCK 与 checkdb 命令一起使用。所以我试过了dbcc checkdb With Tablock
。但我收到了同样的错误信息。那么这个错误的原因是什么。我正在使用 sql server 2008 R2 express(服务包 2)。