Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.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 Alter table可根据以前选择的查询添加动态列_Sql_Sql Server - Fatal编程技术网

Sql Alter table可根据以前选择的查询添加动态列

Sql Alter table可根据以前选择的查询添加动态列,sql,sql-server,Sql,Sql Server,是否可以根据以前的一些select查询更改表并添加具有动态名称/数据类型的列 我希望在SQL中执行的伪等效操作是: foreach row in tableA { alter tableB add row.name row.datatype } 这是针对SQL Server的。当然,您可以使用动态SQL执行此操作。当然,您可以使用动态SQL执行此操作。如前所述,您可以使用动态SQL执行此操作。大致如下: Declare @SQL1 nvarchar(4000) SELECT @SQL1=

是否可以根据以前的一些select查询更改表并添加具有动态名称/数据类型的列

我希望在SQL中执行的伪等效操作是:

foreach row in tableA
{
  alter tableB add row.name row.datatype
}

这是针对SQL Server的。

当然,您可以使用动态SQL执行此操作。

当然,您可以使用动态SQL执行此操作。

如前所述,您可以使用动态SQL执行此操作。大致如下:

Declare @SQL1  nvarchar(4000)
SELECT @SQL1=N'ALTER TABLE mytable'+NCHAR(13)+NCHAR(10)
+N' ADD COLUMN '+ my_new_column_name + ' varchar(25)'+NCHAR(13)+NCHAR(10)
-- SELECT LEN(@SQL1), @SQL1
EXECUTE (@SQL1)

除了这是一个混乱、容易出错、存在安全风险、需要高授权才能执行以及需要多个变量处理大于4000个字符的批之外,从设计角度来看(取决于您何时/为什么这样做)。

如前所述,您可以使用动态sql来实现这一点。大致如下:

Declare @SQL1  nvarchar(4000)
SELECT @SQL1=N'ALTER TABLE mytable'+NCHAR(13)+NCHAR(10)
+N' ADD COLUMN '+ my_new_column_name + ' varchar(25)'+NCHAR(13)+NCHAR(10)
-- SELECT LEN(@SQL1), @SQL1
EXECUTE (@SQL1)


除了这是一个混乱、容易出错、存在安全风险、需要高授权才能执行以及需要多个变量处理超过4000个字符的批之外,从设计角度来看(取决于您何时/为什么这样做)。

您在这里真正想做什么?对我来说,这听起来像是一个例子。样本数据和预期结果会很好,你的尝试和/或研究以及一个明确的问题也会很好。就像这样:一旦你选择了这条路径,你会发现在tsql代码中使用这样一个表要困难得多。三思而后行,你到底想干什么?对我来说,这听起来像是一个例子。样本数据和预期结果会很好,你的尝试和/或研究以及一个明确的问题也会很好。就像这样:一旦你选择了这条路径,你会发现在tsql代码中使用这样一个表要困难得多。对此三思而后行。这并不能回答这个问题。若要评论或要求作者澄清,请在其帖子下方留下评论。-这提供了一个解决方案的建议,因此是一个有效的答案。这既不是批评,也不是要求澄清。请注意,实际的问题是“是否可能…”。一个导致答案的建议应该作为评论发布。一个真实的答案应该作为答案发布。@AleksG我不知道你是从哪里得到这个印象的。这不是关于元的共识。相反,这不是共识,也不是问题的答案。若要评论或要求作者澄清,请在其帖子下方留下评论。-这提供了一个解决方案的建议,因此是一个有效的答案。这既不是批评,也不是要求澄清。请注意,实际的问题是“是否可能…”。一个导致答案的建议应该作为评论发布。一个真实的答案应该作为答案发布。@AleksG我不知道你是从哪里得到这个印象的。这不是关于元的共识。相反的情况并非如此,因为查询可能会工作,但它不会检查表/列是否存在。此外,它不会检查表中已有的列数及其大小。无论如何,动态添加列是一个疯狂的想法,就像从悬崖上跳下来一样。如果OP想要检查是否存在,这可以通过查询sys.tables(object_id)和sys.columns来完成。我猜想他会事先知道是否应该增加这个专栏。我同意你的“疯狂”评论。跳下悬崖可能很有趣,但不应掉以轻心。如果你真的想帮助此人,请向他解释这种疯狂,或者至少向他展示如何进行保护。没有足够的信息来评估哪些保护(如果有的话)是可行的。我想,通过应用程序进行的任何模式更改通常都是每个人的噩梦,包括用户、开发人员和数据库。该查询可能会工作,但不会检查表/列是否存在。此外,它不会检查表中已有的列数及其大小。无论如何,动态添加列是一个疯狂的想法,就像从悬崖上跳下来一样。如果OP想要检查是否存在,这可以通过查询sys.tables(object_id)和sys.columns来完成。我猜想他会事先知道是否应该增加这个专栏。我同意你的“疯狂”评论。跳下悬崖可能很有趣,但不应掉以轻心。如果你真的想帮助此人,请向他解释这种疯狂,或者至少向他展示如何进行保护。没有足够的信息来评估哪些保护(如果有的话)是可行的。我想,通过应用程序进行的任何模式更改通常都是每个人的噩梦,包括用户、开发人员和DBA