Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 下一步从 删除IF LEN行和以下设置…“全部联合”行,因为它们不正确且无用 在构建CREATE UNIQUE…的行末尾的字符串中,将GO放在下一行 您可以用一个CTE来完成所有这一切,并去掉两个临时表和游标,但我没有时间来说明这一点,而且查询目前的状态确实有效_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql 下一步从 删除IF LEN行和以下设置…“全部联合”行,因为它们不正确且无用 在构建CREATE UNIQUE…的行末尾的字符串中,将GO放在下一行 您可以用一个CTE来完成所有这一切,并去掉两个临时表和游标,但我没有时间来说明这一点,而且查询目前的状态确实有效

Sql 下一步从 删除IF LEN行和以下设置…“全部联合”行,因为它们不正确且无用 在构建CREATE UNIQUE…的行末尾的字符串中,将GO放在下一行 您可以用一个CTE来完成所有这一切,并去掉两个临时表和游标,但我没有时间来说明这一点,而且查询目前的状态确实有效,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,关于字符串执行长度的任何可能限制:可以放入VARCHAR(MAX)或NVARCHAR(MAX)中的任何内容(根据的文档)。我已经在NVARCHAR(MAX)变量(远远超过4000个字符)中构建了相当大的查询集,并毫无问题地调用了EXEC 打印@sql时,您只能看到大约一半的表,原因是PRINT命令最多只能打印8000个字符的VARCHAR或4000个字符的NVARCHAR,即使您的变量是MAX类型。为了打印所有内容,您需要使用SUBSTRING()每4000或8000个字符循环一次(取决于NVA

关于字符串执行长度的任何可能限制:可以放入
VARCHAR(MAX)
NVARCHAR(MAX)
中的任何内容(根据的文档)。我已经在
NVARCHAR(MAX)
变量(远远超过4000个字符)中构建了相当大的查询集,并毫无问题地调用了EXEC

打印
@sql
时,您只能看到大约一半的表,原因是
PRINT
命令最多只能打印8000个字符的
VARCHAR
或4000个字符的
NVARCHAR
,即使您的变量是
MAX
类型。为了打印所有内容,您需要使用
SUBSTRING()
每4000或8000个字符循环一次(取决于NVARCHAR和VARCHAR变量)


注释掉
SET@sql=@sql+'UNION ALL'
行时,您什么也看不到的原因是,我总是建议在所有
IF
/
/etc构造周围放置开始/结束标记,即使只执行一行。这意味着,通过注释掉
SET
行,并且很可能不注释掉
IF
,那么
IF
语句将应用于剩余的
SET
,并且只运行
SET@sql=@sql+'创建唯一的…
lineIFLEN(@sql)>0,它永远不会是;-)

请注意如何将
UNION ALL
与动态SQL结合使用

如果需要连接多个查询或批处理,只需连接字符串,如

SET @sql = 'SELECT 1 ' + ' SELECT 2 '
当您使用
UNION ALL
创建语句时,您不知道将有多少个选择(或者您不想为此烦恼),请创建一个以
UNION ALL
结尾的字符串,然后剪切最后9-10个字符

SET @sql = 'SELECT 1 AS col FROM MyTable' + ' UNION ALL ' + ... + ' SELECT 1 FROM MyTable UNOIN ALL'
SET @sql = LEFT (@sql, len(@sql) - 10

正在转换的索引是构成主键的列,但我们不将它们标识为键。(如果有道理的话)当然我们也不使用外键。这是建筑师的决定。@ThomasAsh:关于“我们也不使用外键。这是建筑师的决定。”,me认为你需要一个新的建筑师;-)。这是一个可怕的决定,除了明显的数据完整性问题外,还有性能方面的影响。这里没有争论。我们的遗留DW广泛使用密钥。不同的架构师。我不太了解不定义主键对性能的影响。你想启发我吗?在我们的传统DW中,我假设它们是防止删除表和索引的保护措施,但与性能无关。@ThomasAsh:使用FKs可以让查询优化器在特定条件下消除某些操作。他们确保你没有孤立的数据。它们只是大规模插入操作的性能问题,但可以在这些操作期间禁用,然后重新启用。PS:仅供参考,如果您是针对不是提交答案的人(或您评论的任何人)的人,那么您需要以@和用户名开头,否则不会通知他们您的评论。谢谢!我没想到会有如此丰富的信息。但是您对12的评论(删除LEN声明和UNION声明)解决了这个问题,其他评论将帮助我开发更好的代码。还删除了变量和命令的连接。@ThomasAsh:是的,12是功能上的改进,而其余的是教育性的。从技术上讲,这两个问题都与字符串变量限制有关,这就是为什么我将它们与列表下面的特定问题的答案分开。不管怎样,你说你是新手,所以我想我会给你指出正确的方向:-)。请不要忘记将此标记为答案。谢谢。@ThomasAsh:事实上,#8(特别是第1部分)是功能性和关键性的,否则您可能无法正确复制索引定义。为了更清楚,我在#8的两个子部分都添加了一点。再次感谢。在这种特殊情况下,我们从一个传统系统中提取数据,该系统总是按称为内部条目号(IEN)的ASC整数排序。数据来自多个系统,我们区分IEN的方式是通过STA3N,它是整数。所以主键是STA3N+IEN。因为遗留系统是分层的(MUMPS),所以它有嵌套的表,每个嵌套级别添加一个IEN。因此,第三级(3表)SQL表的主键应该是STA3N+L1IEN+L2IEN+L3IEN,这就是我试图在其上创建聚集索引的地方。你认为这有什么问题吗?@ThomasAsh:我希望你所说的
STA3N+L1IEN+L2IEN
是指这三个独立的字段。当然,在这种情况下,忽略建议8.2听起来不错。但是,您仍然必须执行建议8.1,否则您可能会得到
STA3N+L2IEN+L1IEN
L2IEN+STA3N+L1IEN
,等等。此外,为什么要创建
唯一聚集索引
,而不是
主键聚集
?集群主键会更好。
SET @sql = 'SELECT 1 ' + ' SELECT 2 '
SET @sql = 'SELECT 1 AS col FROM MyTable' + ' UNION ALL ' + ... + ' SELECT 1 FROM MyTable UNOIN ALL'
SET @sql = LEFT (@sql, len(@sql) - 10