locked
SQL con XML RRS feed

  • Pregunta

  • Buenos días,

    Necesito comunicar SQL Server con otra plataforma mediante XML y SOAP, pero desconozco qué pasos seguir y si necesito instalar software adicional (¿IIS?)

    Mi idea es utilizar la opción "FOR XML" para generar lo que quiero enviar, pero no sé cómo enviar ni cómo capturar lo que me envíen. (¿Creando un extremo hhtp?)

    Puede alguien ayudarme con esto??

    Muchas gracias,

    Gufix

    miércoles, 2 de agosto de 2006 9:24

Respuestas

  • 1.- el problema los tienes en la autenticación, repasa en los libros en pantalla estos dos apartados

    Endpoint Authentication Types y SQL Server Authentication over SOAP

     

    2.- De la comunicación entre el servicio web y el procedimiento tu no debes preocuparte, de eso se encarga la publicación, tu solo debes hallar la forma de enviarle los datos soap a la parte publicada.

     

    3.- Si instalas los ejemplos de SQL Server 2005 tienes un ejemplo ya construido que se llama XMLOnlineCatalog, el script de creación de los endpoints es este, intenta abrir este proyecto, te servirá de ayuda (espero )

    /*=====================================================================

    File: Install.sql for Online Catalog

    Summary: Retrieves product information from the Adventure Works databases.

    Date: June 9, 2003

    ---------------------------------------------------------------------

    This file is part of the Microsoft SQL Server Code Samples.

    Copyright (C) Microsoft Corporation. All rights reserved.

    This source code is intended only as a supplement to Microsoft

    Development Tools and/or on-line documentation. See these other

    materials for detailed information regarding Microsoft code samples.

    THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY

    KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE

    IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A

    PARTICULAR PURPOSE.

    ======================================================= */

    USE AdventureWorks

    GO

    IF EXISTS (SELECT * FROM sys.procedures WHERE name = 'GetProductDescription')

    DROP PROCEDURE GetProductDescription;

    GO

     

    CREATE PROCEDURE GetProductDescription

    @ProductModelID int

    AS

    SET NOCOUNT ON;

    SELECT CatalogDescription

    FROM Production.ProductModel

    WHERE CatalogDescription.value('

    declare namespace p1="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";

    data(/p1:ProductDescription[1]/@ProductModelID)', 'int') = @ProductModelID;

    GO

    USE master

    GO

    --You may need to have this permission granted to you if you are not an administrator

    --IF NOT EXISTS(SELECT * from sys.server_permissions where type = 'CRHE' and grantee_principal_id = @UPID)

    --BEGIN

    -- EXECUTE('GRANT CREATE ENDPOINT TO [' + @UserName + ']')

    --END

    -- Drop old end point if it exists

    IF EXISTS (SELECT * FROM sys.http_endpoints WHERE name = 'sql_ProductCatalog')

    DROP ENDPOINT sql_ProductCatalog; -- case sensitive

    GO

    -- Add endpoint for retrieving product information

    CREATE ENDPOINT sql_ProductCatalog

    STATE = STARTED

    AS HTTP (

    SITE = 'localhost',

    PATH = '/ProductCatalog',

    AUTHENTICATION = (INTEGRATED ),

    PORTS = ( CLEAR )

    )

    FOR SOAP (

    WEBMETHOD 'testns'.'GetProductDescription'

    (NAME='AdventureWorks.dbo.GetProductDescription', SCHEMA=STANDARD ),

    WSDL = DEFAULT,

    BATCHES = ENABLED,

    DATABASE = 'AdventureWorks',

    NAMESPACE = 'myURI'

    );

    GO

    -- Theoretically not necessary.

    -- use master

    -- EXEC ('GRANT CONNECT ON ENDPOINT::sql_ProductCatalog TO [' + @UserName + '];');

    -- GO

    -- Add connect permissions to the endpoint

     

    USE AdventureWorks

    GO

    -- Capture the OS version in a temp table so that we can pick

    -- the correct windows account to grant access to for the objects

    -- defined in this file. This enables ASP.NET programs to access

    -- these objects.

    CREATE TABLE #GetVersionValues

    (

    [Index] int,

    [Name] sysname,

    Internal_value int,

    Character_Value sysname

    );

    GO

    INSERT #GetVersionValues

    EXEC master.dbo.xp_msver 'WindowsVersion';

    GO

    DECLARE @OSVersion decimal(9, 2);

    DECLARE @ASPUserName nvarchar(100);

    DECLARE @NetworkService nvarchar(100);

    -- For globalization purposes, the sample install script uses a SID to set NT AUTHORITY\NETWORK SERVICE

    -- SELECT SUSER_SID('NT AUTHORITY\NETWORK SERVICE') returns the English SID.

    SET @NetworkService = SUSER_SNAME(0x010100000000000514000000);

    SELECT @OSVersion = CONVERT(decimal(9, 2), SUBSTRING(Character_Value, 1, CHARINDEX(' ', Character_Value) - 1))

    FROM #GetVersionValues;

    -- IIS6 uses a different account to run web apps under. II6 first shipped with Windows 2003 (v5.2).

    IF (@OSVersion < 5.20)

    SET @ASPUserName = @@ServerName + N'\ASPNET';

    ELSE

    SET @ASPUserName = @NetworkService;

    IF NOT EXISTS(SELECT principal_id FROM sys.server_principals where name = @ASPUserName)

    BEGIN

    EXEC sp_grantlogin @ASPUserName;

    END

    IF NOT EXISTS(SELECT principal_id from sys.database_principals where name = @ASPUserName)

    BEGIN

    EXEC sp_grantdbaccess @ASPUserName;

    END

    EXEC('GRANT SELECT ON Production.ProductModel TO [' + @ASPUserName + '];');

    EXEC('GRANT SELECT ON Production.ProductPhoto TO [' + @ASPUserName + '];');

     

    use AdventureWorks

    GO

    DROP TABLE #GetVersionValues;

    GO

     

    Espero que te ayude

    jueves, 24 de agosto de 2006 6:56
    Moderador

Todas las respuestas

  • Lo que estás buscando es Biztalk. Móntalo en preproducción y comparte tu experiencia sobre este producto.
    jueves, 17 de agosto de 2006 18:40
  • Si es para devolver información desde SQL a otra plataforma puedes usar la nueva posibilidad de publicar procedimientos almacenados como servicios web, y no es necesario IIS.

     

    Saludos

    Miguel Egea

    martes, 22 de agosto de 2006 9:36
    Moderador
  • Miguel, es precisamente lo que estoy haciendo. Estoy utilizando los extremos o endpoints http que ofrece SQL Server 2005.

    En este caso he declarado un extremo de tipo SOAP que se encargará de cargar unos datos sencillos. Sin embargo, tengo dos problemas:

    1. No me deja conectar. Es decir, creo que si la conexión llega (el error es distinto si existe o no el endpoint) pero me devuelve "Error en el servidor remoto (401) No autorizado."

    2. ¿Cómo recibe los datos sql server? Es decir, he publicado un procedimiento almacenado, pero no sé de dónde sacar los datos que recibo. ¿Llegan como variables?¿En una tabla temporal?

    Muchas gracias,

    Marco

    miércoles, 23 de agosto de 2006 19:10
  • 1.- el problema los tienes en la autenticación, repasa en los libros en pantalla estos dos apartados

    Endpoint Authentication Types y SQL Server Authentication over SOAP

     

    2.- De la comunicación entre el servicio web y el procedimiento tu no debes preocuparte, de eso se encarga la publicación, tu solo debes hallar la forma de enviarle los datos soap a la parte publicada.

     

    3.- Si instalas los ejemplos de SQL Server 2005 tienes un ejemplo ya construido que se llama XMLOnlineCatalog, el script de creación de los endpoints es este, intenta abrir este proyecto, te servirá de ayuda (espero )

    /*=====================================================================

    File: Install.sql for Online Catalog

    Summary: Retrieves product information from the Adventure Works databases.

    Date: June 9, 2003

    ---------------------------------------------------------------------

    This file is part of the Microsoft SQL Server Code Samples.

    Copyright (C) Microsoft Corporation. All rights reserved.

    This source code is intended only as a supplement to Microsoft

    Development Tools and/or on-line documentation. See these other

    materials for detailed information regarding Microsoft code samples.

    THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY

    KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE

    IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A

    PARTICULAR PURPOSE.

    ======================================================= */

    USE AdventureWorks

    GO

    IF EXISTS (SELECT * FROM sys.procedures WHERE name = 'GetProductDescription')

    DROP PROCEDURE GetProductDescription;

    GO

     

    CREATE PROCEDURE GetProductDescription

    @ProductModelID int

    AS

    SET NOCOUNT ON;

    SELECT CatalogDescription

    FROM Production.ProductModel

    WHERE CatalogDescription.value('

    declare namespace p1="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";

    data(/p1:ProductDescription[1]/@ProductModelID)', 'int') = @ProductModelID;

    GO

    USE master

    GO

    --You may need to have this permission granted to you if you are not an administrator

    --IF NOT EXISTS(SELECT * from sys.server_permissions where type = 'CRHE' and grantee_principal_id = @UPID)

    --BEGIN

    -- EXECUTE('GRANT CREATE ENDPOINT TO [' + @UserName + ']')

    --END

    -- Drop old end point if it exists

    IF EXISTS (SELECT * FROM sys.http_endpoints WHERE name = 'sql_ProductCatalog')

    DROP ENDPOINT sql_ProductCatalog; -- case sensitive

    GO

    -- Add endpoint for retrieving product information

    CREATE ENDPOINT sql_ProductCatalog

    STATE = STARTED

    AS HTTP (

    SITE = 'localhost',

    PATH = '/ProductCatalog',

    AUTHENTICATION = (INTEGRATED ),

    PORTS = ( CLEAR )

    )

    FOR SOAP (

    WEBMETHOD 'testns'.'GetProductDescription'

    (NAME='AdventureWorks.dbo.GetProductDescription', SCHEMA=STANDARD ),

    WSDL = DEFAULT,

    BATCHES = ENABLED,

    DATABASE = 'AdventureWorks',

    NAMESPACE = 'myURI'

    );

    GO

    -- Theoretically not necessary.

    -- use master

    -- EXEC ('GRANT CONNECT ON ENDPOINT::sql_ProductCatalog TO [' + @UserName + '];');

    -- GO

    -- Add connect permissions to the endpoint

     

    USE AdventureWorks

    GO

    -- Capture the OS version in a temp table so that we can pick

    -- the correct windows account to grant access to for the objects

    -- defined in this file. This enables ASP.NET programs to access

    -- these objects.

    CREATE TABLE #GetVersionValues

    (

    [Index] int,

    [Name] sysname,

    Internal_value int,

    Character_Value sysname

    );

    GO

    INSERT #GetVersionValues

    EXEC master.dbo.xp_msver 'WindowsVersion';

    GO

    DECLARE @OSVersion decimal(9, 2);

    DECLARE @ASPUserName nvarchar(100);

    DECLARE @NetworkService nvarchar(100);

    -- For globalization purposes, the sample install script uses a SID to set NT AUTHORITY\NETWORK SERVICE

    -- SELECT SUSER_SID('NT AUTHORITY\NETWORK SERVICE') returns the English SID.

    SET @NetworkService = SUSER_SNAME(0x010100000000000514000000);

    SELECT @OSVersion = CONVERT(decimal(9, 2), SUBSTRING(Character_Value, 1, CHARINDEX(' ', Character_Value) - 1))

    FROM #GetVersionValues;

    -- IIS6 uses a different account to run web apps under. II6 first shipped with Windows 2003 (v5.2).

    IF (@OSVersion < 5.20)

    SET @ASPUserName = @@ServerName + N'\ASPNET';

    ELSE

    SET @ASPUserName = @NetworkService;

    IF NOT EXISTS(SELECT principal_id FROM sys.server_principals where name = @ASPUserName)

    BEGIN

    EXEC sp_grantlogin @ASPUserName;

    END

    IF NOT EXISTS(SELECT principal_id from sys.database_principals where name = @ASPUserName)

    BEGIN

    EXEC sp_grantdbaccess @ASPUserName;

    END

    EXEC('GRANT SELECT ON Production.ProductModel TO [' + @ASPUserName + '];');

    EXEC('GRANT SELECT ON Production.ProductPhoto TO [' + @ASPUserName + '];');

     

    use AdventureWorks

    GO

    DROP TABLE #GetVersionValues;

    GO

     

    Espero que te ayude

    jueves, 24 de agosto de 2006 6:56
    Moderador
  • Miguel,

    Muchísimas gracias. Guiándome por tu código creo que podré solucionarlo. Estoy revisando los parámetros de autentificación que uso...

    Sólo una cosa más: ¿No tendrás el código de cliente equivalente? Es decir: el XML que se enviaría para invocar el procedimiento almacenado.

    Un saludo y muchas gracias,

    Marco

    jueves, 24 de agosto de 2006 8:44
  • Si, está en los samples del propio SQL Server 2005, si no lo tienes instalados te recomiendo que los instales, en cualquier caso si quieres puedes mandarme un mail a webmaster arroba portalsql punto com y estaré gustoso de enviarte el ejemplo por mail en un zip.

    P.D.: Si crees que esta ha sido una respuesta válidad márcalo en el foro :)

    jueves, 24 de agosto de 2006 8:47
    Moderador