Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.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 使用存储过程参数返回列_Sql_Database_Stored Procedures_Sql Server 2016 - Fatal编程技术网

Sql 使用存储过程参数返回列

Sql 使用存储过程参数返回列,sql,database,stored-procedures,sql-server-2016,Sql,Database,Stored Procedures,Sql Server 2016,我正在尝试编写一个存储过程,它将根据两个输入参数返回一个特定的值。问题是试图使其中一个参数引用列 这是我的桌子: CityID CityName London Paris ----------- -------------------- --------------------------------------- -- 1

我正在尝试编写一个存储过程,它将根据两个输入参数返回一个特定的值。问题是试图使其中一个参数引用列

这是我的桌子:

CityID      CityName             London                               Paris                                   
----------- -------------------- --------------------------------------- --
1           London               0                                       60                                      
2           Paris                50                                      0                                       
3           Berlin               90                                      60                                      
4           Madrid               150                                     90                                      
5           Dublin               30                                      80                                      
6           Rome                 75                                      88    
是否可以按照以下方式编写存储过程:

CREATE PROCEDURE Price (@city1, @city2)
AS
    SELECT @city2 
    FROM dbo.MyTable
    WHERE CityName = @city1

您必须使用动态sql

CREATE PROC Price (@City1, @City2)
AS 
BEGIN
DECLARE @Sql NVARCHAR(MAX)
SET @Sql = 'SELECT ' + @City2 + ' FROM dbo.MyTable WHERE CityName = ''' + 
@City1 +  ''''

EXEC sp_execute @Sql
END

创建过程[dbo]。[USP_价格] @瓦查尔市1号, ------------------------------------------------ @City2 VARCHAR(最大)=零输出

作为 开始

结束

---创建存储过程,如果您使用的是sql server, 右键单击存储过程,然后单击执行存储过程 输入城市1的值,同时为城市2选择null
然后执行

我会这样做,在尝试运行动态SQL语句之前验证列名的存在:

create procedure dbo.GetPrice(@city nvarchar(50), @column nvarchar(200)) as
begin

if (not exists (select *
                from sys.columns
                where object_id = object_id('dbo.MyTable') and name = @column))
    return;
else begin
    declare @sql nvarchar(max) =
        'SELECT [' + @column + '] FROM dbo.MyTable WHERE CityName = ''' + @city + '''';

    execute sp_ExecuteSQL @sql;
end;

end;

您所描述的是动态SQL。您希望传入一列的名称,然后为匹配的城市返回该列的值。对吧?是的,没错。恐怕我不熟悉动态Sql。如果不知道您正在使用的RDBMS,就无法准确回答这个问题。看起来像MS SQL,但请随版本一起确认。是的,是MS SQL。我正在使用SQL server 2016。这不会解析。不仅如此,如果有人通过
@City2='0;删除表用户;选择null“
尝试使用上面的查询创建存储过程我正在获取“将数据类型varchar转换为数值时出错”。“目前我不需要检查列的存在性。我只是在本地测试了这个,当我运行
execute dbo.GetPrice“test”,“London”时,它工作正常检查列的存在性目前对我来说没有必要。如果您想避免人们运行任意SQL语句,那么这是必要的。
create procedure dbo.GetPrice(@city nvarchar(50), @column nvarchar(200)) as
begin

if (not exists (select *
                from sys.columns
                where object_id = object_id('dbo.MyTable') and name = @column))
    return;
else begin
    declare @sql nvarchar(max) =
        'SELECT [' + @column + '] FROM dbo.MyTable WHERE CityName = ''' + @city + '''';

    execute sp_ExecuteSQL @sql;
end;

end;