0

我有一个这个程序(简化):

CREATE PROCEDURE myProcedure
    @var1 int,
    @var2 NVARCHAR(50),
    @var3 NVARCHAR(50),
    @var4 NVARCHAR(50)  
AS
BEGIN
   SELECT 
       stuff AS (SELECT date FROM dateTable WHERE condition), 
       otherStuff
       moreStuff
   FROM
       myTable
   WHERE
       myConditions;
END

它说我在两个地方的语法不正确:

  1. 第 2 行靠近单词 SELECT
  2. ')' 附近的第 2 行
  3. 第 9 行靠近单词 AS

我知道子查询只返回 1 个字符串(无论如何只会返回 1 个字符串)。

在我添加子查询之前它就起作用了,所以一定是有什么东西把它搞砸了。

编辑:为了澄清,我想打印“stuff”中的值,但列的名称应该是我的子查询返回的,而不是相反=)

第二次编辑:

好的,假设我有表格:myTable1myTable2.

这是myTable1

| stuff | otherStuff | otherStuff |
|   x   |    x       |    x       |
|   x   |    x       |    x       |
             ...

这是myTable2

| date  | id |
| x/x/x | 1  |
| x/x/x | 2  | 
     ...

这就是我想要SELECT的回报:

| x/x/x | otherStuff | otherStuff |
|   x   |    x       |    x       |
|   x   |    x       |    x       |
4

2 回答 2

3

别名AS在之后或=之前使用

SELECT 
   stuff = (SELECT date FROM dateTable WHERE condition), 
   otherStuff
   moreStuff
FROM
   myTable
WHERE
   myConditions;

SELECT 
   (SELECT date FROM dateTable WHERE condition) AS stuff, 
   otherStuff
   moreStuff
FROM
   myTable
WHERE
   myConditions;

问题编辑后

您不能在普通选择中使用动态列名。这真的没有意义,因为现在您的返回数据集因子查询而异。

您可以使用其中一种

  • 使用所需别名构建查询的动态 SQL
  • 添加一个额外的列作为列名

例子:

SELECT 
   (SELECT date FROM dateTable WHERE condition) AS StuffColumnName, 
   stuff,
   otherStuff
   moreStuff
FROM
   myTable
WHERE
   myConditions;
于 2013-07-04T11:25:14.730 回答
3

应该是这样的:

  SELECT 
       (SELECT date FROM dateTable WHERE condition) AS stuff , 
       otherStuff
       moreStuff
   FROM
       myTable
   WHERE
       myConditions;

别名应该在相关子查询之后,假设这个子查询只返回一个值。

另一种语法是这样写:

  SELECT 
       stuff = (SELECT date FROM dateTable WHERE condition), 
       otherStuff
       moreStuff
   FROM
       myTable
   WHERE
       myConditions;

更新

正如@gbn 在他的回答中所说,你必须使用动态 SQL 来这样做,这真的没有意义,但如果你想以任何方式这样做,你可以这样做:

DECLARE @columnname VARCHAR(20);
DECLARE @query VARCHAR(2000);

SELECT @columnname =  QUOTENAME([date]) FROM dateTable;


SELECT @query = 'SELECT (SELECT date FROM dateTable) AS' +  @columnname + 
                 ' , otherStuff, moreStuff FROM myTable';

execute(@query);

像这样:

于 2013-07-04T11:22:13.473 回答