نتائج SQL الديناميكية في جدول مؤقت في إجراء SQL المخزن

StackOverflow https://stackoverflow.com/questions/662049

  •  20-08-2019
  •  | 
  •  

سؤال

رمز على النحو التالي:

ALTER PROCEDURE dbo.pdpd_DynamicCall 
@SQLString varchar(4096) = null

AS

Begin

    create TABLE #T1 ( column_1 varchar(10) , column_2 varchar(100) )

    insert into #T1 
        execute ('execute ' + @SQLString )

    select * from #T1 

End

المشكلة هي أنني أريد استدعاء إجراءات مختلفة يمكنها إعادة أعمدة مختلفة.لذلك يجب أن أقوم بتعريف الجدول #T1 بشكل عام.لكني لا أعرف كيف.

يمكن لأي شخص أن يساعدني في هذه المشكلة؟

هل كانت مفيدة؟

المحلول

يحاول:

SELECT into #T1 execute ('execute ' + @SQLString )

وهذه رائحتها سيئة للغاية مثل ثغرة أمنية في حقن SQL.


تصحيح (حسب تعليقCarpeDiem):

INSERT into #T1 execute ('execute ' + @SQLString )

أيضا، حذف 'execute' إذا كانت سلسلة SQL شيئًا آخر غير الإجراء

نصائح أخرى

ويمكنك تحديد الجدول حيوي تماما كما تقوم بإدراج فيه حيوي، ولكن المشكلة هي مع نطاق الجداول المؤقتة. على سبيل المثال، هذا الرمز:

DECLARE @sql varchar(max)
SET @sql = 'CREATE TABLE #T1 (Col1 varchar(20))'
EXEC(@sql)
INSERT INTO #T1 (Col1) VALUES ('This will not work.')
SELECT * FROM #T1

وسيعود مع الخطأ "اسم الكائن غير صالح '# T1". هذا هو لأنه يتم إنشاء جدول مؤقت # T1 في "مستوى أدنى" من كتلة من تنفيذ التعليمات البرمجية. من أجل إصلاح، واستخدام جدول مؤقت العالمي:

DECLARE @sql varchar(max)
SET @sql = 'CREATE TABLE ##T1 (Col1 varchar(20))'
EXEC(@sql)
INSERT INTO ##T1 (Col1) VALUES ('This will work.')
SELECT * FROM ##T1

ويساعد هذا الأمل، جيسي

كن حذرا من حل جدول مؤقت العالمي كما قد تفشل هذا إذا اثنين من المستخدمين استخدام نفس الروتين في نفس الوقت كما يمكن أن يرى جدول مؤقت العالمي من قبل جميع المستخدمين ...

وإنشاء جدول مؤقت العالمي مع GUID في اسم حيوي. ثم يمكنك العمل معها في التعليمات البرمجية، عن طريق مزود داين، دون قلق أن عملية أخرى يدعو نفسه sproc سوف استخدامه. وهذا مفيد عندما كنت لا تعرف ما يمكن توقعه من الجدول المحدد الكامنة وراء كل مرة يتم تشغيله بحيث لا يمكنك إنشاء جدول مؤقت صراحة مسبقا. أي - تحتاج إلى استخدام SELECT * INTO جملة

DECLARE @TmpGlobalTable varchar(255) = 'SomeText_' + convert(varchar(36),NEWID())

-- select @TmpGlobalTable 

-- build query
    SET @Sql = 
        'SELECT * INTO [##' + @TmpGlobalTable + '] FROM SomeTable'
EXEC (@Sql)
EXEC ('SELECT * FROM [##' + @TmpGlobalTable + '] ')
EXEC ('DROP TABLE [##' + @TmpGlobalTable + ']')
PRINT 'Dropped Table ' + @TmpGlobalTable 
INSERT INTO #TempTable
EXEC(@SelectStatement)
DECLARE @EmpGroup INT =3 ,
        @IsActive BIT=1

DECLARE @tblEmpMaster AS TABLE
        (EmpCode VARCHAR(20),EmpName VARCHAR(50),EmpAddress VARCHAR(500))

INSERT INTO @tblEmpMaster EXECUTE SPGetEmpList @EmpGroup,@IsActive

SELECT * FROM @tblEmpMaster
CREATE PROCEDURE dbo.pdpd_DynamicCall 
AS
DECLARE @SQLString_2 NVARCHAR(4000)
SET NOCOUNT ON
Begin
    --- Create global temp table
    CREATE TABLE ##T1 ( column_1 varchar(10) , column_2 varchar(100) )

    SELECT @SQLString_2 = 'INSERT INTO ##T1( column_1, column_2) SELECT column_1 = "123", column_2 = "MUHAMMAD IMRON"'
    SELECT @SQLString_2 = REPLACE(@SQLString_2, '"', '''')

    EXEC SP_EXECUTESQL @SQLString_2

    --- Test Display records
    SELECT * FROM ##T1

    --- Drop global temp table 
    IF OBJECT_ID('tempdb..##T1','u') IS NOT NULL
    DROP TABLE ##T1
End

ولست متأكدا إذا فهمت جيدا، ولكن ربما يمكن أن تشكل عبارة CREATE داخل سلسلة، ثم تنفيذ هذه السلسلة؟ وبهذه الطريقة يمكن إضافة العديد من الأعمدة كما تريد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top